Python:Tkinter根窗口不再出现

时间:2015-06-03 16:42:32

标签: python tkinter

我正在遇到一些问题,在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()

有关为什么窗口不再出现的任何想法?

1 个答案:

答案 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方法将创建辅助窗口,等待它被销毁,然后显示主窗口。