2013-12-07 52 views
1

我想使用config.ini的值作爲Tkinter Entry項目的啓動值。 當程序結束時,我想將這些條目的內容寫入config.ini。 我有2個問題,用下面的代碼:tkinter和configparser:尋找更美麗的解決方案

# 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()不工作了!

  • 第二個問題:重複相同的東西2次在代碼中(一次用於閱讀,一次用於寫入)並不那麼美麗。也許有辦法以更短的方式鏈接條目和config.ini參數?不僅在Tkinter的,而且在wxPython,pygame的,等等。當主循環的整理工作就銷燬所有部件和窗口 -

回答

2

計劃(和所有小工具)作爲主循環工作,只要存在。你必須在mainloop之前保存配置。

你可以添加按鈕quit與保存配置和關閉程序的assinged功能。

(未測試的代碼)

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) 

也許你也可以assing此功能closing event保存配置時,用戶使用關閉按鈕[X]。

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

非常感謝你。 – Basj