在 python 中使用一个 tkinter 按钮创建多个 windows

Create multiple windows using one tkinter button in python

我正在从单个 tkinter 按钮打开其他 windows,如下所示: 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()

如果我 运行 这个程序,则不可能点击“打开 window”按钮两次来获得两个 Toplevel 实例。我想只用一个按钮获得尽可能多的实例。这有可能吗?

只需删除 window.grab_set()。 grab_set() 方法将此应用程序的所有事件路由到此小部件。无论生成什么事件,如按钮单击或按键,都会定向到另一个 window。

def open_window(self):
    window = Window(self)

考虑这行代码:

window.grab_set()

这是在创建的第一个 window 上设置 grab。这意味着来自键盘和鼠标的所有事件都将传送到创建的第一个 window。这意味着在删除抓取之前,您不能再单击根 window 中的按钮。请注意,如果 window 被销毁,则自动删除抢夺。

Grab 通常在创建模态对话框时使用——在程序继续之前需要用户输入的对话框。通过抓取,您可以确保用户在与对话框交互之前无法与主程序交互。

解决方案很简单:如果您的目标是能够同时打开多个 windows,则删除对 window.grab_set() 的调用。