Tkinter方法deiconify似乎不适用于ubuntu(12.04,unity)

时间:2013-08-31 11:57:41

标签: python ubuntu tkinter

Tkinter方法" deiconify"似乎没有在ubuntu(12.04,unity)上工作,但是下面的代码在Windows 7上按预期工作。我需要显示窗口,即使在另一个项目https://github.com/thinker3/youdao中发生某些事情时它被最小化。

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()

1 个答案:

答案 0 :(得分:1)

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

要使GUI执行任何操作,必须运行事件循环。发生的 Everything 是对事件的响应。在屏幕上绘制窗口是对事件的响应。单击按钮是对事件的响应。按下按钮的视觉效果是对事件的响应。等等。

当您致电iconify时,会导致事件被发送到应用程序,说“从屏幕上移除窗口”。事件循环查看事件,并重绘(或“取消”绘制)窗口。当您调用deiconify时会发生相反的情况 - 系统会获得重绘事件,并且tkinter会重新绘制屏幕上的窗口。

在您的代码中,您永远不会给事件循环提供响应这些事件的机会。你问它iconfiy,然后你睡觉,然后你deiconify,所有没有给事件循环一个机会回应。当sleep命令正在运行时,不处理事件。因此,当您从睡眠状态唤醒时,系统会隐藏窗口,然后在几微秒后重新绘制窗口。

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

如果您希望窗口消失,稍后再重新出现,请使用事件循环。允许事件循环更新屏幕,并安排在将来的某个时间发生deiconify。例如:

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

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