2013-12-07 3 views
1

Я хочу использовать значения config.ini в качестве стартовых значений для элементов ввода Tkinter. Когда программа закончена, я хочу записать содержимое этих записей в 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 короче?

ответ

2

программа (и все виджеты) существует до тех пор, как основной цикл работает - не только в Tkinter, но и в WxPython, Pygame и т.д. Когда MainLoop заканчивает работу он разрушает все виджеты и окна. Вы должны сохранить config перед mainloop.

Вы можете добавить кнопку quit с функцией asseded, которая сохраняет конфигурацию и чем закрывает программу.

(не тестировалось код)

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) 

Может быть, вы могли бы также Ассинг эту функцию 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

Смежные вопросы