【发布时间】:2021-12-27 17:52:15
【问题描述】:
基于this question,我写了以下mwe:
import tkinter as tk
class BaseFrame(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
self.bmanage = tk.Button(self, text='undock', command = self.undock)
self.bforget = tk.Button(self, text='dock', command = self.dock)
self.bmanage.grid(row=0, column=0, padx=20, pady=20, sticky='nsew')
self.bforget.grid(row=0, column=1, padx=20, pady=20, sticky='nsew')
self.dockable_frame = tk.Frame(self, bg="red", height=100)
self.dockable_frame.grid(row=1, column=0, padx=20, pady=20, columnspan=2, sticky='nsew')
self.label = tk.Label(self.dockable_frame, text="hi")
self.label.grid(row=0, column=0, padx=150, pady=20, sticky='nsew')
def undock(self):
self.parent.wm_manage(self.dockable_frame)
self.dockable_frame.configure(bg='blue')
print(type(self.dockable_frame))
def dock(self):
self.parent.wm_forget(self.dockable_frame)
self.dockable_frame.grid()
if __name__ == "__main__":
root = tk.Tk()
base_frame = BaseFrame(root)
base_frame.grid(row=0, column=0, padx=20, pady=20, sticky='nsew')
root.mainloop()
点击取消停靠按钮,红色框架取消停靠,点击停靠按钮,框架再次停靠。我有两个问题:
- 为什么 self.dockable_frame 的类型是
而不是 TopLevel,因为 wm manage documentation 说:指定的小部件将成为独立的顶部级窗口? - 由于 self.dockable_frame.protocol("WM_DELETE_WINDOW", insert_function_here) 在我的 Windows 电脑上出现错误,我该如何处理窗口关闭事件?
错误是:
AttributeError:“框架”对象没有属性“协议”
我理解错误但如何处理窗口关闭事件?
【问题讨论】:
-
你大概可以
self.dockable_frame.bind('<Destroy>', insert_function_here)来处理销毁;至于为什么它不是专门的Toplevel?文档并没有说它必须成为Toplevel,只是它确实成为的顶级窗口
标签: python tkinter events window