Форум сайта python.su
0
Есть самописный класс (config), отвечающий за хранение кое-каких настроек. В его деструкторе (метод __del__()) реализовано сохранение в файл.
Также есть класс, рисующий GUI на tkinter (gui). В нём на событие закрытия окна забинден отдельный метод, который выполняет сохранение в объект класса настроек с последующим выходом из программы.
Так метод забиден
parent.protocol("WM_DELETE_WINDOW", self._update_config_and_close)
self.root.after(1000, self.root.quit)
config.__del__()
Отредактировано Dwarf (Март 1, 2013 22:01:10)
Офлайн
63
Где Вы взяли такую конструкцию???
self.root.after(1000, self.root.quit)
import Tkinter class now: def __del__(self): print "object deleted" def del_me_please(): root.destroy() a = now() root = Tkinter.Tk() root.geometry("200x200+100+100") root.protocol("WM_DELETE_WINDOW", del_me_please) root.mainloop()
Отредактировано 4kpt (Март 1, 2013 22:31:30)
Офлайн
0
Где Вы взяли такую конструкцию??? Зачем она нужна?Повторюсь, это для обхода другой проблемы. Хорошо, давайте для простоты заменим
self.root.after(1000, self.root.quit)
self.root.quit()
Каким образом можно еще выполнить выход из программы или закрытие базового окна?Не совсем понял к чему это. Или вы не знаете тонкостей tkinter? По умолчанию там закрытие работает само собой. Но мне вместо с закрытием нужно провести определенные действия, поэтому я написал свой обработчик.
Во вторых. Каким образом Вы передаете свой config в GUI?Очень просто.
class Gui: def __init__(self, config, root, "другие параметры"): self.config = config self.parent.protocol("WM_DELETE_WINDOW", self._update_config_and_close) def _update_config(self): config.update("новые параметры") def _update_config_and_close(self): self._update_config() self.root.quit() if __name__ == '__main__' root = Tk() config = Config('main.cfg') gui = Gui(config, root, "другие параметры") root.mainloop() # если не вызвать вручную - сохранения не произойдёт # config.__del__()
Отредактировано Dwarf (Март 1, 2013 22:38:32)
Офлайн
63
Во первых. Если Вы в программе прикручиваете такие костыли - это Вы не знаете не то что тонкостей, а и основ работы Tkinter. То что Вы написали используется крайне редко и со значениями далекими от 1000 :). И я практически уверен, что у Вас не тот случай.
Во-вторых. По вашему вопросу. Если код структурно соответствует тому, что Вы написали, то тогда все работает…
import Tkinter class now: def __del__(self): print "object deleted" def update(self): print "object_updated" class Gui: def __init__(self, config, root): self.config = config root.protocol("WM_DELETE_WINDOW", self._update_config_and_close) def _update_config(self): self.config.update() def _update_config_and_close(self): self._update_config() root.destroy() if __name__ == '__main__': root = Tkinter.Tk() config = now() gui = Gui(config, root) root.mainloop()
object_updated object_deleted
Отредактировано 4kpt (Март 1, 2013 23:54:02)
Офлайн
0
Если Вы в программе прикручиваете такие костылиСтараюсь без них. Пока у меня в программе только две странности (и соответственно 2 костыля). Одна из них - указана в этом топике.
А костыль Вы прикрутили, так как окно не хотело закрываться после нажатия на крестик…Если вам интересно зачем я использую, могу пояснить. Вообще-то я хотел это оставить для отдельной темы, но если вам интересно - могу расписать и тут.
self.root.after(1000, self.root.quit)
Отредактировано Dwarf (Март 2, 2013 00:18:12)
Офлайн
63
У меня возникает подозрение, что Вы взяли число 1000 из этого кода…
import Tkinter import ScrolledText import time def sound(event = None): time.sleep(1) print u"Выполняем запрос к микрофону..." if event%5 != 0: print u"Пользователь молчит...\n" else: return (event) def get_data(event = None): i = 0 while 1: i += 1 print u"Посылаем запрос на снятие данных..." x = sound(i) if x != None and x%5 == 0 and x < 20 : print u"Пользователь сказал слово...\n" text.insert("current", u"Пользователь сказал слово через %s вызов" %x + u"\nГоворите\n") text.update() elif x == 20: break root=Tkinter.Tk() text = ScrolledText.ScrolledText(root) text["font"] = "Times New Romain", 14 text.insert("0.end", u"Говорите\n") text.after(1000, get_data) text.focus_force() text.pack() root.mainloop()
Офлайн
0
4kpt боюсь вы не правы, этот код я вижу впервые, а 1000 я подобрал более или менее эмпирическим путём.
Офлайн
63
Просто цифры совпали :) Я и подумал…
Отредактировано 4kpt (Март 2, 2013 00:54:02)
Офлайн
63
Не думали сделать через потоки?
Офлайн
0
Не думали сделать через потоки?Что именно?
Офлайн