#!/usr/bin/python3 import tkinter as tk class Top: def __init__(self): self.widget = tk.Toplevel(h_widgets.root()) self.widget.title('Today is the day') self.widget.protocol("WM_DELETE_WINDOW",self.close) self.tk_trigger = tk.BooleanVar() def close(self,*args): self.widget.withdraw() self.tk_trigger.set(True) def show(self): self.widget.deiconify() self.tk_trigger = tk.BooleanVar() self.widget.wait_variable(self.tk_trigger) class Widgets: def __init__(self): self._root = self._top = self._textbox = None def root(self): if not self._root: self._root = tk.Tk() self._root.withdraw() return self._root def start(self): self.root() self._root.withdraw() def end(self): self.root().destroy() self._root.mainloop() def top(self): if not self._top: self._top = Top() return self._top h_widgets = Widgets() if __name__ == '__main__': h_widgets.start() h_widgets.top().show() h_widgets.end()
Этот код срабатывает так, как задумывалось, но до тех пор, пока я не буду использовать его через другой модуль:
#!/usr/bin/python3 from sample1 import Widgets h_widgets = Widgets() h_widgets.start() h_widgets.top().show() h_widgets.end()
В этом случае код зависает на этапе wait_variable. Я знаю, что проблему можно решить, заменив wait_variable;withdraw на wait_window;destroy, но я хочу сделать многократно используемый код, без повторной паковки. Я нашел описание бага, но не нашел решения или вариантов обхода проблемы. Пытался подсунуть wait_variable в текущий модуль:
class TopTrigger: def add(self,obj): self.obj = obj self.obj.tk_trigger = tk.BooleanVar() def on_close(self,*args): self.obj.tk_trigger.set(True) def on_show(self): self.obj.tk_trigger = tk.BooleanVar() self.obj.widget.wait_variable(self.obj.tk_trigger)