gpt4 book ai didi

python - Tkinter 方法 deiconify 似乎不适用于 ubuntu(12.04,统一)

转载 作者:行者123 更新时间:2023-11-28 18:47:00 26 4
gpt4 key购买 nike

Tkinter 方法“deiconify”似乎不适用于 ubuntu(12.04,统一),但以下代码在 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()

最佳答案

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

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

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

在您的代码中,您永远不会让事件循环有机会响应这些事件。你要求它 iconfiy,然后你 sleep ,然后你 deiconify,所有这些都没有给事件循环响应的机会。当 sleep 命令运行时,没有 事件被处理。因此,当您从 sleep 中醒来时,系统会隐藏窗口,然后在几微秒后重新绘制它。

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

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

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

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

关于python - Tkinter 方法 deiconify 似乎不适用于 ubuntu(12.04,统一),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18547885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com