我正在遇到一些问题,在Toplevel
窗口出现时,让tkinter的根窗口隐藏,然后在关闭时变为可见。
顶层窗口假设是一个配置窗口,完成后,它将配置根窗口。
在我的主tkinter对象类中,我设置如下:
class OthelloGUIGame:
def __init__(self):
'''Create a GUI and prompt for configurations'''
self._root_window = tkinter.Tk()
self._root_window.wm_title("Othello")
def start(self):
'''Starts the tkinter mainloop and displays the gui'''
self._root_window.withdraw()
game_config = GameSetup()
self._root_window.mainloop()
game_config.show()
self._root_window.deiconify()
这非常适合隐藏主Tk窗口,但是当我单击顶层窗口上的“X”时,似乎没有调用deiconfy
方法。
以防这里重要的是我的顶级课程的基本设置:
class GameSetup:
def __init__(self):
self._root_window = tkinter.Toplevel()
self._root_window.wm_title("Game Setup")
self._moves_first = tkinter.StringVar(self._root_window)
self._arrangement = tkinter.StringVar(self._root_window)
self._should_win = tkinter.StringVar(self._root_window)
self._moves_first.set("Black")
self._arrangement.set("Black in upper-left")
self._should_win.set("With more discs")
self._setUpEntries()
self._setUpDropDowns()
def show(self)->None:
'''Show the window'''
self._root_window.grab_set()
self._root_window.wait_wind()
有关为什么窗口不再出现的任何想法?
答案 0 :(得分:2)
一般来说,在mainloop
之后你永远不应该有代码。这是因为mainloop
在根窗口被销毁之前不会返回。由于它被销毁,任何作为根窗口的子窗口创建的窗口也将被销毁。那时除了退出之外,你的GUI还没有什么可做的。
因此,在您的情况下,您正在创建此辅助窗口并等待它被销毁。这不会导致mainloop
退出,并且没有其他代码导致主窗口被取消图标,因此它仍然是隐藏的。
您需要在显示deiconify
窗口的代码后面调用GameConfig
。 调用mainloop
之前需要。通常,您会在GUI初始化后启动游戏,您可以使用after_idle
执行此操作。换句话说,逻辑需要是这样的:
def start(self):
'''Starts the tkinter mainloop and displays the gui'''
self._root_window.withdraw()
game_config = GameSetup()
# N.B. show will not return until the dialog is destroyed
game_config.show()
self._root_window.deiconify()
有了这个,您需要在其他地方调用mainloop
。通常,您会在您的初始化代码中执行此操作。例如:
def __init__(self):
self._root_window = tkinter.Tk()
...
self.after_idle(self.start)
self._root_window.mainloop()
创建窗口,一旦创建窗口就会导致start
,然后启动事件循环。然后start
方法将创建辅助窗口,等待它被销毁,然后显示主窗口。