Tkinter 窗口事件与属性

4 投票
1 回答
8621 浏览
提问于 2025-04-16 06:11

我一直在寻找关于Tkinter窗口特性的资料,但没有找到。我的平台是Windows,使用的是Python 2.7。帖子最后有一些代码,可以用来探索Tkinter窗口事件。

  1. 如何检测窗口的最小化和最大化事件?当我绑定窗口的<Configure>事件时,返回的事件对象并没有包含这些事件的信息。我也查找过一些协议(比如WM_DELETE_WINDOW),希望能找到相关的事件,但都没有成功。

  2. 如何确定窗口边框的大小(不是Tkinter的框架,而是操作系统在Tkinter放置控件的容器周围放置的边框)?有没有一种不依赖于平台的方法来发现这些窗口属性,还是说我需要使用像Windows下的win32 API这样的特定平台的解决方案?

  3. 如何判断一个窗口是否可见,比如通过.withdraw()设置的窗口是否不可见?

  4. 是否可以取消一个窗口事件,比如如果想把窗口限制在用户桌面的某个位置?从窗口的<Configure>事件返回'break'并不能取消窗口的移动或调整大小事件。

这里有一些示例代码,可以用来实验Tkinter窗口事件。

from __future__ import print_function
try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk

def onFormEvent(event):
    for key in dir(event):
        if not key.startswith('_'):
            print('%s=%s' % (key, getattr(event, key)))
    print()


root = tk.Tk()
root.geometry('150x50')
lblText = tk.Label(root, text='Form event tester')
lblText.pack()
root.bind('<Configure>', onFormEvent)
root.mainloop()

更新:这是我对以下事件的了解:

  1. event.type == 22(以下之一或多个发生了变化:宽度、高度、x、y)
  2. event.type == 18(最小化) event.widget.winfo_viewable() = 0(不可见)
  3. event.type == 19(从最小化恢复)
  4. event.type == 2(最大化)
  5. event.type == 22(由于宽度和高度的变化,从最大化恢复)

1 个回答

3

要判断一个窗口是否可见,可以使用 .winfo_viewable() 这个方法。如果窗口可见,它会返回 1,如果不可见,则返回 0

如果你想让窗口不能被调整大小,先把窗口设置成你想要的样子,然后在你的 __init__ 方法的最后加上

self.root.minsize(self.root.winfo_reqwidth(), self.root.winfo_reqheight())
self.root.maxsize(self.root.winfo_reqwidth(), self.root.winfo_reqheight())

如果你想完全禁止移动窗口,最简单的方法就是去掉窗口的标题栏和边框,可以用 self.root.overrideredirect(True) 这个命令。

撰写回答