使用python中的一个tkinter按钮创建多个窗口

问题描述

我正在从一个 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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...