简体   繁体   English

只开一个Tk.Toplevel window

[英]Open only one Tk.Toplevel window

I bound the opening of a new window (Tk.Toplevel) on a button.我在一个按钮上绑定了一个新的 window (Tk.Toplevel) 的开口。 However, if I press the button twice, two windows turn on.但是,如果我按两次按钮,两个 windows 就会打开。 Can I deactivate the button until the new window is turned off, or display a message box if I press the button twice?我是否可以在关闭新的 window 之前停用该按钮,或者如果我按两次按钮显示一个消息框?

If you don't want to import an external library.如果您不想导入外部库。 You can simply check if root contains any instance of Toplevel using isinstance() .您可以使用isinstance()简单地检查 root 是否包含任何Toplevel实例。

Here is an example:这是一个例子:

from tkinter import *
from tkinter import messagebox 


def top():
    
    if not any(isinstance(x, Toplevel) for x in root.winfo_children()):
            top = Toplevel(root)
            lbl = Label(top, text='TopLevel')
            lbl.pack()    
             
    else:
        
        messagebox.showinfo("showinfo", "Top level already exists")
        
    

root = Tk()

btn = Button(root, text='text', command=top)
btn.pack()

root.mainloop()

If you simply want to disable the button.如果您只是想禁用该按钮。

from tkinter import *
from tkinter import messagebox 


def top():

 
        btn['state'] = 'disabled'
        top = Toplevel(root)
        lbl = Label(top, text='TopLevel')
        lbl.pack()

        top.protocol("WM_DELETE_WINDOW", lambda : btn.configure(state='normal') or top.destroy())


                
root = Tk()

btn = Button(root, text='text', command=top)
btn.pack()

root.mainloop()

You can disable/enable button or you can assign TopLevel to global variable which at start has value None and you check if it is still None before creating window.您可以disable/enable按钮,也可以将TopLevel分配给开始时值为None的全局变量,并在创建 window 之前检查它是否仍然为None if it is not None then don't create window.如果不是None则不要创建 window。 When you close window then you set it again None .当你关闭 window 然后你再次设置它None

This method can be use for any object which can be only one at some moment - ie.此方法可用于任何 object,在某个时刻只能是一个 - 即。 bullet in game.游戏中的子弹。

import tkinter as tk  # PEP8: `import *` is not preferred

# --- functions ---

def close_top():
    global single_top

    single_top.destroy()
    single_top = None
    
def open_top():
    global single_top
    
    if single_top is None:
        single_top = tk.Toplevel(root)
        l = tk.Label(single_top, text='TopLevel')
        l.pack()    
        single_top.protocol("WM_DELETE_WINDOW", close_top)
    else:
        print("Top level already exists")
    
# --- main ---

single_top = None

root = tk.Tk()

b = tk.Button(root, text='TOP', command=open_top)
b.pack()

root.mainloop()

EDIT:编辑:

The same structure with disabled button与禁用按钮相同的结构

import tkinter as tk  # PEP8: `import *` is not preferred

# --- functions ---

def close_top():

    single_top.destroy()

    b['state'] = 'normal'
    
def open_top():
    global single_top

    b['state'] = 'disable'
    
    single_top = tk.Toplevel(root)
    l = tk.Label(single_top, text='TopLevel')
    l.pack()    
    single_top.protocol("WM_DELETE_WINDOW", close_top)
    
# --- main ---

root = tk.Tk()

b = tk.Button(root, text='TOP', command=open_top)
b.pack()

root.mainloop()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM