创建子 window 并禁用对主 window 的访问的有效方法?
Efficient way to create a child window with access to main window disabled?
我正在寻找创建子 window 的最有效方法,并且还禁止对主 window 的所有访问,以便用户必须单击 "OK" 子 window 内的按钮,以便恢复对主 window 的访问。
这是我的代码,使用 Toplevel class。它有效,但是有没有更有效的方法?
from tkinter import *
class MainWindow(Tk):
def __init__(self):
Tk.__init__(self)
def SetEnableStatus(self, status):
for w in self.winfo_children():
if status == False:
w.grab_set()
else:
w.grab_release()
def CreateChildWindow(self):
subWindow = Toplevel(self)
def quit_subwindow():
subWindow.destroy()
self.SetEnableStatus(True) # Enable all widgets of main window
Button(subWindow, text='Exit', command=quit_subwindow).pack()
self.SetEnableStatus(False) # Disable all widgets of main window
在Toplevel
object上调用grab_set
应该就够了,当你用完了,你可以简单地销毁它,然后调用grab_set
在 self
上(但我不是 100% 确定,即使下面的结果程序证实了这一点)。
事实上,如果您在 Tk
根 window 上创建一个按钮,并且如果您与此按钮相关联,例如打印某些内容的 lambda 函数,那么在 "setting the grab" 在 child window.
请参阅以下示例,其中基本上所有事件都重定向到 Toplevel
window,而不是 Tk
根目录 window:
from tkinter import *
class MainWindow(Tk):
def __init__(self):
Tk.__init__(self)
Entry(self).pack(side="left")
Button(self, text="whoami", command=lambda : print("A Tk root window.")).pack(side="left")
def CreateChildWindow(self):
subWindow = Toplevel(self)
def quit_subwindow():
subWindow.destroy()
self.grab_set()
Button(subWindow, text="whoami", command=lambda : print("A Toplevel child window.")).pack()
Button(subWindow, text='Exit', command=quit_subwindow).pack()
subWindow.grab_set()
win = MainWindow()
win.CreateChildWindow()
win.mainloop()
查看 effbot.org 上的以下文章,了解有关如何创建对话框的更多信息:
我正在寻找创建子 window 的最有效方法,并且还禁止对主 window 的所有访问,以便用户必须单击 "OK" 子 window 内的按钮,以便恢复对主 window 的访问。
这是我的代码,使用 Toplevel class。它有效,但是有没有更有效的方法?
from tkinter import *
class MainWindow(Tk):
def __init__(self):
Tk.__init__(self)
def SetEnableStatus(self, status):
for w in self.winfo_children():
if status == False:
w.grab_set()
else:
w.grab_release()
def CreateChildWindow(self):
subWindow = Toplevel(self)
def quit_subwindow():
subWindow.destroy()
self.SetEnableStatus(True) # Enable all widgets of main window
Button(subWindow, text='Exit', command=quit_subwindow).pack()
self.SetEnableStatus(False) # Disable all widgets of main window
在Toplevel
object上调用grab_set
应该就够了,当你用完了,你可以简单地销毁它,然后调用grab_set
在 self
上(但我不是 100% 确定,即使下面的结果程序证实了这一点)。
事实上,如果您在 Tk
根 window 上创建一个按钮,并且如果您与此按钮相关联,例如打印某些内容的 lambda 函数,那么在 "setting the grab" 在 child window.
请参阅以下示例,其中基本上所有事件都重定向到 Toplevel
window,而不是 Tk
根目录 window:
from tkinter import *
class MainWindow(Tk):
def __init__(self):
Tk.__init__(self)
Entry(self).pack(side="left")
Button(self, text="whoami", command=lambda : print("A Tk root window.")).pack(side="left")
def CreateChildWindow(self):
subWindow = Toplevel(self)
def quit_subwindow():
subWindow.destroy()
self.grab_set()
Button(subWindow, text="whoami", command=lambda : print("A Toplevel child window.")).pack()
Button(subWindow, text='Exit', command=quit_subwindow).pack()
subWindow.grab_set()
win = MainWindow()
win.CreateChildWindow()
win.mainloop()
查看 effbot.org 上的以下文章,了解有关如何创建对话框的更多信息: