简体   繁体   English

tkinter和configparser:寻找更漂亮的解决方案

[英]tkinter and configparser : looking for a more beautiful solution

I want to use config.ini 's values as startup values for Tkinter Entry items. 我想将config.ini的值用作Tkinter Entry项目的启动值。 When the program is finished, I want to write the content of these Entry into the config.ini . 程序完成后,我想将这些Entry的内容写入config.ini I have 2 problems with the following code : 我的以下代码有2个问题:

# create the Entry textboxes
e1 = Entry(f1); e1.grid(row=1,column=1,sticky=W)
e2 = Entry(f1); e2.grid(row=2,column=1,sticky=W)
e3 = Entry(f1); e3.grid(row=3,column=1,sticky=W)

# fill them with content from config.ini file
import ConfigParser
config = ConfigParser.ConfigParser()
config.read('config.ini')
e1.insert(0, config.get('Default','Param1'))
e2.insert(0, config.get('Default','Blah7'))
e3.insert(0, config.get('Default','Param3'))

tk.mainloop()

# save the Entry values to config.ini
config.set('Default', 'Param1', e1.get())
config.set('Default', 'Blah7', e2.get())
config.set('Default', 'Param3', e3.get())
config.write(open('config.ini','w'))
  • First problem : once the tk.mainloop() is finished, e1.get() doesn't work anymore! 第一个问题: tk.mainloop()完成后, e1.get()不再起作用!

  • Second problem : it's not so beautiful to have to repeat the same things 2 times in the code (once for reading, once for writing). 第二个问题:在代码中重复两次相同的事情并不是一件很漂亮的事情(一次阅读,一次写作)。 Maybe there's a way to link the Entry with the config.ini parameters in a shorter way ? 也许有一种更短的方法将Entry与config.ini参数链接起来?

Program (and all widgets) exists as long as mainloop is working - not only in tkinter but also in wxpython, pygame, etc. When mainloop is finishing work it destroys all widgets and window. 只要mainloop在工作,程序(和所有小部件)都存在-不仅在tkinter中,而且还在wxpython,pygame等中。当mainloop完成工作时,它将破坏所有小部件和窗口。 You have to save config before mainloop. 您必须在mainloop之前保存配置。

You can add button quit with assinged function which save config and than close program. 您可以使用附带的功能添加按钮quit功能,该功能可以保存配置并关闭程序。

(not tested code) (未经测试的代码)

def saveConfig():
    global config

    config.set('Default', 'Param1', e1.get())
    config.set('Default', 'Blah7', e2.get())
    config.set('Default', 'Param3', e3.get())
    config.write(open('config.ini','w'))

    root.quit()

Button(root, "QUIT", command=saveConfig)

Maybe you could also assing this function to closing event to save config when user use close button [X]. 也许您还可以在用户使用关闭按钮[X]时将此功能关联到closing event以保存配置。

root.protocol("WM_DELETE_WINDOW", saveConfig)

Code reading config and code writing config are not identical. 代码读取配置和代码写入配置不相同。 There is no shorter way. 没有捷径可走。

You can only use lists and for loop to make load/save "nicer" :) 您只能使用列表和for循环来使加载/保存“ nicer” :)

 entries = []
 options = []

 entries.append(Entry(f1)); entries[-1].grid(row=1,column=1,sticky=W)
 options.append("Param1")

 entries.append(Entry(f1)); entries[-1].grid(row=2,column=1,sticky=W)
 options.append("Blah7")

 entries.append(Entry(f1)); entries[-1].grid(row=3,column=1,sticky=W)
 options.append("Param3")

 # load

 import ConfigParser
 config = ConfigParser.ConfigParser()
 config.read('config.ini')

 for index, e in enumerate(entries):
     e.insert(0, config.get("Default", options[index]) )

 # save

 for index, e in enumerate(entries):
     config.set("Default", options[index], e.get())

 config.write(open('config.ini','w'))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM