tkinter和configparser:寻找更美观的解决方案

时间:2013-12-07 21:34:29

标签: python tkinter configparser

我想将config.ini的值用作Tkinter Entry项的启动值。 程序完成后,我想将这些条目的内容写入config.ini。 我有以下代码的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'))
  • 第一个问题:tk.mainloop()完成后,e1.get()不再有效!

  • 第二个问题:在代码中两次重复相同的事情并不是那么美好(一次用于阅读,一次用于写入)。也许有一种方法可以用更短的方式将条目与config.ini参数链接起来?

1 个答案:

答案 0 :(得分:2)

只要mainloop工作,程序(和所有小部件)就存在 - 不仅在tkinter中,而且在wxpython,pygame等中。当mainloop完成工作时,它会销毁所有小部件和窗口。你必须在mainloop之前保存配置。

您可以添加带有辅助功能的按钮quit,该功能可以保存配置,而不是关闭程序。

(未经过测试的代码)

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)

当用户使用关闭按钮[X]时,也许您还可以将此功能分配给closing event以保存配置。

root.protocol("WM_DELETE_WINDOW", saveConfig)

代码读取配置和代码写入配置不相同。没有更短的路。

你只能使用列表和for循环来加载/保存“更好”:)

 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'))