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()
答案 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命令将运行。