0

我正在使用 TKInter 创建一个显示一些信息的窗口,比如通知。单击主应用程序的“查看详细信息”按钮时,应显示该窗口。

这是我正在谈论的窗口的代码。Categories() 方法在点击上述按钮时被调用。

from tkinter import *
from tkinter import ttk

def Categories():


    roots = Tk()
    roots.minsize(600, 600)
    roots.title("Category Details")



    labelFrameCategory = ttk.LabelFrame(roots,text="Financial")
    labelFrameCategory.configure()
    labelFrameCategory.grid(column=0 ,row=0, pady=10, padx = 30 , sticky = W)


    labelClass = Label(labelFrameCategory, text="Documents related to finance")
    labelClass.grid(column=0, row=1)
    labelClass.config(font=("Courier", 15))

    roots.resizable(False, False)
    roots.mainloop()




我遇到的问题是每次按下按钮时,它都会创建一个新窗口,但会打开当前窗口。所以如果我点击 10 次,它将打开 10 个类似的窗口。但我希望它只打开 1 个窗口,无论单击多少次按钮,都应该只有 1 个这样的窗口。怎么做 ?

4

2 回答 2

2

看起来您的函数Categories是从另一个Tk实例的按钮命令调用的。通常,您希望避免创建超过 1 个Tk.

对于您的问题,有很多方法可以做到这一点。一种方法是在单击时简单地禁用您的按钮命令,并在窗口销毁时重新激活该命令:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

def new_window():
    a.config(command="")
    roots = tk.Toplevel() #Use Toplevel instead if you simply want another window
    roots.minsize(600, 600)
    roots.title("Category Details")

    labelFrameCategory = ttk.LabelFrame(roots,text="Financial")
    labelFrameCategory.configure()
    labelFrameCategory.grid(column=0 ,row=0, pady=10, padx = 30 , sticky = tk.W)

    labelClass = tk.Label(labelFrameCategory, text="Documents related to finance")
    labelClass.grid(column=0, row=1)
    labelClass.config(font=("Courier", 15))

    roots.resizable(False, False)

    def quit_window():
        a.config(command=new_window)
        roots.destroy()

    roots.protocol("WM_DELETE_WINDOW",quit_window)

a = tk.Button(root,text="Click to open new win",command=new_window)
a.pack()

root.mainloop()

或者,您也可以设置一个类似的标志window_open=True并检查该标志。

于 2019-05-28T03:55:13.753 回答
0

而不是禁用按钮,

为什么不使用顶层的属性名称?

这将允许您使用顶层的单个实例。

试试下面的代码。

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

def new_window():
    #a.config(command="")
    #use instead name='something'
    roots = tk.Toplevel(name='goofy') #Use Toplevel instead if you simply want another window
    roots.minsize(600, 600)
    roots.title("Category Details")

    labelFrameCategory = ttk.LabelFrame(roots,text="Financial")
    labelFrameCategory.configure()
    labelFrameCategory.grid(column=0 ,row=0, pady=10, padx = 30 , sticky = tk.W)

    labelClass = tk.Label(labelFrameCategory, text="Documents related to finance")
    labelClass.grid(column=0, row=1)
    labelClass.config(font=("Courier", 15))

    roots.resizable(False, False)

    def quit_window():
        a.config(command=new_window)
        roots.destroy()

    roots.protocol("WM_DELETE_WINDOW",quit_window)

a = tk.Button(root,text="Click to open new win",command=new_window)
a.pack()

root.mainloop()
于 2019-05-28T05:38:31.140 回答