[英]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.