[英]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.