在 Python 中使用 tkinter。从 tk.Toplevel() 创建了一个对话框
阅读各种帖子和文档后:
self.resizable(width=False, height=False)
self.wm_transient(self._mainwin)
self.transient(self._mainwin)
self.wait_visibility()
self.grab_set()
self.update_idletasks() # draw
self.wait_window(self)
只是好奇 wm_transient() 和瞬态() 之间有什么区别?我需要两者还是只需要其中之一?
在 Tkinter 中,
transient()
和
wm_transient()
都用于创建“瞬态”窗口,这些窗口在行为上与其“父”窗口相关联。但是,它们之间存在细微差别:
-
wm_transient(master)
: 这是一个底层方法,直接与窗口管理器通信。它将当前窗口设置为相对于master
窗口是“瞬态”的。这通常意味着:- 瞬态窗口始终显示在父窗口的顶部。
- 当父窗口最小化时,瞬态窗口通常也会最小化。
- 瞬态窗口通常不会出现在任务栏中(这取决于窗口管理器)。
-
transient(master)
: 这是一个 Tkinter 方法,它提供了对瞬态窗口行为的附加控制级别。如果master
为 None(默认值),则此方法会移除任何瞬态设置。如果指定了master
,则它通常会调用wm_transient()
并可能执行其他特定于平台的操作。
那么,你需要使用哪一个呢?
在大多数情况下,你应该使用
transient(master)
。这是推荐的方法,因为它处理了跨不同窗口管理器的平台特定差异。它提供了更高级别的抽象,让你不必担心底层细节。
在以下情况下,你可能需要直接使用
wm_transient()
:
- 你需要对瞬态窗口的行为进行非常细粒度的控制,并且你了解不同窗口管理器之间的细微差别。
-
transient()
方法在你的平台或窗口管理器中无法正常工作。
关于你的代码示例:
在你的代码中,你同时使用了
wm_transient()
和
transient()
,并都设置了相同的
master
窗口。这实际上是多余的,因为
transient()
内部可能会调用
wm_transient()
。你可以只使用
transient(self._mainwin)
并删除
wm_transient()
行。
简而言之,坚持使用
transient()
,除非你有令人信服的理由使用
wm_transient()
。