【问题标题】:How to prevent tkinter from generating duplicating windows如何防止 tkinter 生成重复窗口
【发布时间】:2019-10-13 12:54:10
【问题描述】:

我正在使用 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 个这样的窗口。该怎么做?

【问题讨论】:

    标签: python user-interface tkinter tkinter-layout


    【解决方案1】:

    看起来您的函数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 的标志并检查该标志。

    【讨论】:

      【解决方案2】:

      而不是禁用按钮,

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

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

      试试下面的代码。

      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()
      

      【讨论】:

      • 因为如果您第二次单击该按钮,该函数将再次执行,并且在您的 Toplevel 上生成的任何现有输入/结果都将丢失。尝试放置一个条目字段,输入一些内容然后查看。
      猜你喜欢
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 2014-03-24
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多