3

Tkinter 方法“deiconify”似乎不适用于 ubuntu(12.04,unity),但以下代码在 Windows 7 上按预期工作。我需要显示窗口,即使在另一个项目https://github 发生某些事情时它被最小化。 com/thinker3/有道

from time import sleep
from Tkinter import Tk

class GUI():
    def __init__(self):
        self.root = Tk()
        self.root.title("Test")
        self.root.protocol("WM_DELETE_WINDOW", self.close_handler)
        self.root.mainloop()

    def close_handler(self):
        self.root.iconify()
        sleep(1)
        self.root.deiconify()


if __name__ == '__main__':
    gui = GUI()
4

1 回答 1

1

您所看到的显然是 Windows 和非 Windows 之间的区别。在我看来,Windows 行为是一个错误。至少,这不是预期的行为。你在 ubuntu 上看到的正是我希望看到的。

为了让 GUI 做任何事情,事件循环必须正在运行。发生的一切都是对事件的响应。在屏幕上绘制窗口是对事件的响应。单击按钮是对事件的响应。按下按钮的视觉效果是对事件的响应。等等。

当您调用 时iconify,这会导致向应用程序发送一个事件,说明“从屏幕上删除窗口”。事件循环看到事件,并重新绘制(或“取消”绘制)窗口。当你调用时会发生相反的情况deiconify——系统得到一个重绘事件,并且 tkinter 重绘屏幕上的窗口。

在您的代码中,您永远不会让事件循环有机会响应这些事件。你让它图标化,然后你睡觉,然后你去图标化,所有这些都没有给事件循环一个响应的机会。当sleep命令运行时,不处理任何事件。因此,当您从睡眠中醒来时,系统会隐藏窗口,然后在几微秒后重新绘制它。

Windows 上可能发生的情况是窗口管理器正在获取 iconfiy 命令并在没有 tkinter 参与的情况下删除窗口。换句话说,tkinter 实际上并没有做任何事情让它消失。然而,在基于 X11 的系统上,这一切都由事件循环管理。

如果您希望窗口消失,并在一秒钟后重新出现,请使用事件循环来发挥您的优势。允许事件循环更新屏幕,并安排去图标化在将来的某个时间发生。例如:

def close_handler(self):
    self.root.iconify()
    self.after(1000, self.root.deiconify)

这应该适用于所有平台。它允许事件循环响应 iconify 事件,然后一秒钟后 deiconify 命令将运行。

于 2013-08-31T13:42:47.440 回答