Python Tkinter方法deiconify在ubuntu上似乎不起作用(12.04,unity)

Python Tkinter方法deiconify在ubuntu上似乎不起作用(12.04,unity),python,ubuntu,tkinter,Python,Ubuntu,Tkinter,Tkinter方法“deiconify”似乎在ubuntu(12.04,unity)上不起作用,但下面的代码在Windows7上的效果与预期一样。我需要显示窗口,即使它是最小化时,在另一个项目中发生的事情 你所看到的显然是窗口和非窗口之间的区别。在我看来,Windows的行为是一个bug。至少,这不是预期的行为。你在ubuntu上看到的正是我期望看到的 GUI要执行任何操作,必须运行事件循环。发生的一切都是对事件的反应。在屏幕上绘制窗口是对事件的响应。单击按钮是对事件的响应。按下按钮的视觉效果是

Tkinter方法“deiconify”似乎在ubuntu(12.04,unity)上不起作用,但下面的代码在Windows7上的效果与预期一样。我需要显示窗口,即使它是最小化时,在另一个项目中发生的事情


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

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

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

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

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

如果希望窗口消失,然后在第二秒后重新出现,请使用事件循环。允许事件循环更新屏幕,并安排在将来的某个时候进行解除加密。例如:

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

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

您的代码似乎与最小化无关。你所做的只是当用户试图破坏它时显示(唯一)窗口。另外,您的
close\u处理程序可能看起来什么也不做,因为您不允许事件循环在完成之前更新屏幕。@BryanOakley:self.root.iconify()最小化窗口。这是我做的一个简化的例子,特别是为了在运行windows7和ubuntu时看到它们之间的一些差异。你最小化程序,然后冻结程序一秒钟,然后对它进行去实体化。您永远不会看到它被最小化,因为GUI是冻结的。需要运行事件循环才能将窗口从屏幕上删除。@BryanOakley:在windows7上,当关闭它时,我看到它最小化到任务栏,1秒后再次显示。在ubuntu上,它不会再次显示,除非我单击启动器上的图标。after()方法在windows上工作,虽然与sleep()有点不同,但它在ubuntu上不能像预期的那样工作。@metaphy:您必须更具体一些。“不起作用”是什么意思?你看到了什么?在ubuntu上,关闭窗口后,它会进入启动程序,但不会再次显示,似乎deiconify()不起作用。
def close_handler(self):
    self.root.iconify()
    self.after(1000, self.root.deiconify)