【发布时间】:2021-09-01 09:20:29
【问题描述】:
我正在尝试使用具有多个级别窗口的 tkinter 构建 GUI。当我打开一个新的顶级窗口时,我需要抓住他的括号。为此,我在 Toplevel 类的开头使用了grab_set()。
新的顶层子窗口还将具有一些其他功能,允许打开新的顶层孙子窗口。问题是,当任何顶层孙窗口关闭时,处于抓取状态的窗口的层次结构会被释放,然后它们都可以再次被操作。
当一个grab_settled 孙子窗口被释放时,我如何维护grab_set() 函数对所有窗口都有效?
这是一个重现此行为的简单代码示例
from tkinter import *
class GUI(Frame):
def __init__(self, master, *args, **kwargs):
Frame.__init__(self, master, *args, **kwargs)
self.master = master
self.my_frame = Frame(self.master)
self.my_frame.pack()
self.button1 = Button(self.master, text="Open New Window", command=OpenFirstToplevelWindow)
self.button1.pack()
self.text = Text(self.master, width=30, height=3)
self.text.pack()
self.text.insert(END, "Some text")
class OpenFirstToplevelWindow(Toplevel):
def __init__(self, *args, **kwargs):
Toplevel.__init__(self, *args, **kwargs)
self.grab_set()
top_button = Button(self, text="Open a second window", command=OpenSecondToplevelWindow)
top_button.pack()
app.text.delete(1.0, END)
app.text.insert(END, "Text edition should be inhibited")
# Toplevel.wait_window(self)
class OpenSecondToplevelWindow(Toplevel):
def __init__(self, *args, **kwargs):
Toplevel.__init__(self, *args, **kwargs)
self.grab_set()
top_button = Button(self, text="close second window", command=self.close_window)
top_button.pack()
app.text.delete(1.0, END)
app.text.insert(END, "Text edition still inhibited")
def close_window(self):
app.text.delete(1.0, END)
app.text.insert(END, "Text edition should keep inhibited but it IS NOT")
self.destroy()
if __name__ == "__main__":
root = Tk()
app = GUI(root)
root.mainloop()
--- 编辑扩展@acw1668 答案---
我一直在研究您的答案,看起来效果很好。问题是我已经意识到,如果我尝试将self 放在最后一个窗口中的关闭按钮的名称以供进一步使用,那么该方法不起作用:
class OpenSecondToplevelWindow(MyToplevel):
def __init__(self, *args, **kwargs):
MyToplevel.__init__(self, *args, **kwargs)
enable_button = Button(self, text="Enable close button", command=self.enable_click)
enable_button.pack()
self.low_button = Button(self, text="Close second window", command=self.close_window, state=DISABLED)
self.low_button.pack()
app.text.delete(1.0, END)
app.text.insert(END, "Text edition still inhibited")
def enable_click(self):
self.low_button["state"] = NORMAL
def close_window(self):
app.text.delete(1.0, END)
app.text.insert(END, "Text edition should keep inhibited but it IS NOT")
self.destroy()
【问题讨论】: