问题描述
我正在从一个 tkinter 按钮打开其他窗口,如下所示: https://www.pythontutorial.net/tkinter/tkinter-toplevel/ 那里显示的代码是
import tkinter as tk
from tkinter import ttk
class Window(tk.Toplevel):
def __init__(self,parent):
super().__init__(parent)
self.geometry('300x100')
self.title('Toplevel Window')
ttk.Button(self,text='Close',command=self.destroy).pack(expand=True)
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('300x200')
self.title('Main Window')
# place a button on the root window
ttk.Button(self,text='Open a window',command=self.open_window).pack(expand=True)
def open_window(self):
window = Window(self)
window.grab_set()
if __name__ == "__main__":
app = App()
app.mainloop()
如果我运行这个程序,就不可能点击“打开窗口”按钮两次来获得两个 Toplevel 实例。我想只用一个按钮就可以获得尽可能多的实例。这有可能吗?
解决方法
考虑这行代码:
window.grab_set()
这是在创建的第一个窗口上设置 grab。这意味着来自键盘和鼠标的所有事件都汇集到创建的第一个窗口。这意味着在删除抓取之前,您不能再单击根窗口中的按钮。注意,如果窗口被销毁,抓取会自动移除。
通常在创建模态对话框时使用抓取——一个需要用户输入才能继续程序的对话框。通过抓取,您可以确保用户在与对话框交互之前无法与主程序交互。
解决方案很简单:如果您的目标是能够打开可以同时使用的多个窗口,则删除对 window.grab_set()
的调用。
只需删除 window.grab_set()
。 grab_set() 方法将此应用程序的所有事件路由到此小部件。任何生成的事件(如按钮点击或按键)都被定向到另一个窗口。
def open_window(self):
window = Window(self)