多次点击按钮时只打开 1 window
Only open 1 window when button clicked multiple times
我正在尝试创建一个基本的发票系统。但是我遇到了一个问题,您可以从我的标题中看出,有什么办法可以实现这一目标。我一直在使用计数器来确定 window 是否应该打开,但我认为它不正确。
from tkinter import *
window = Tk()
count = 0
def openNewWindow():
global count
count = count + 1
if count == 1:
newWindow = Toplevel(window)
newWindow.title("New Window")
newWindow.geometry("800x800")
newWindow.title('test ©') # Frame title
newWindow.iconbitmap('icon4.ico') # Frame logo
if 'normal' == newWindow.state():
count = 2
else:
count = 0
width = window.winfo_screenwidth()
height = window.winfo_screenheight()
window.geometry("%dx%d" % (width, height))
bg = PhotoImage(file="bsor.gif")
label_image = Label(window, image=bg)
label_image.place(x=0, y=0)
title_label = Label(window, text="Job Management System", bg="black", fg="white")
title_label.config(font=("Courier", 70))
title_label.place(x=65, y=3)
customer_database_button = Button(window, text="Customer Database", width="23", height="2",
font=('Courier', 13, 'bold'), command=openNewWindow)
customer_database_button.grid(row=3, column=0, pady=185, padx=(110, 0))
employee_database_button = Button(window, text="Employee Database", width="23", height="2",
font=('Courier', 13, 'bold'))
employee_database_button.grid(row=3, column=1, pady=10, padx=(50, 0))
job_category_button = Button(window, text="Job Category (Pricing)", width="23", height="2",
font=('Courier', 13, 'bold'))
job_category_button.grid(row=3, column=2, pady=10, padx=(50, 0))
quote_sale_button = Button(window, text="Quotes / Sales", width="23", height="2", font=
('Courier', 13, 'bold'))
quote_sale_button.grid(row=3, column=3, pady=10, padx=(50, 0))
cash_management_button = Button(window, text="Cash Management", width="23", height="2", font=
('Courier', 13, 'bold'))
cash_management_button.grid(row=3, column=4, pady=10, padx=(50, 0))
analysis_mode_button = Button(window, text="Analysis Mode", width="23", height="2", font=
('Courier', 13, 'bold'))
analysis_mode_button.grid(row=3, column=5, pady=10, padx=(50, 0))
window.title('test') # Frame title
window.iconbitmap('icon4.ico') # Frame logo
window.mainloop()
这是一个关于如何做到这一点的最小示例(最好只允许一个额外的 window):
from tkinter import Tk, Toplevel, Button
def open_window(button):
button.config(state='disabled')
top = Toplevel(root)
top.transient(root)
top.focus_set()
top.bind('<Destroy>', lambda _: btn.config(state='normal'))
root = Tk()
root.geometry('300x200')
btn = Button(root, text='Open new window!', command=lambda: open_window(btn))
btn.pack(expand=True)
root.mainloop()
只需让函数禁用按钮并将 <Destroy>
事件绑定到 Toplevel
即可将按钮的状态设置回正常状态。 (另外你可能想在 Toplevel
上使用 .transient
使它出现在它的主人之上,这样人们就不会忘记他们还没有关闭 window 并且想知道为什么他们可以'按下按钮(它也不会在任务栏中显示额外的图标))
还有:
我强烈建议在导入内容时不要使用通配符 (*
),您应该导入您需要的内容,例如from module import Class1, func_1, var_2
等等或导入整个模块:import module
然后你也可以使用别名:import module as md
或类似的东西,关键是不要导入所有东西,除非你真的知道你在做什么;名称冲突是问题所在。
我强烈建议关注 PEP 8 - Style Guide for Python Code。函数和变量名称应在 snake_case
中,class 中的名称应在 CapitalCase
中。如果用作关键字参数 (func(arg='value')
) 的一部分,则在 =
周围不要有 space,但如果它用于 =
,则在 =
周围有 space赋值 (variable = 'some value'
)。在运算符周围有 space(+-/
等:value = x + y
(此处除外 value += x + y
))。在函数和 class 声明周围有两个空行。
我正在尝试创建一个基本的发票系统。但是我遇到了一个问题,您可以从我的标题中看出,有什么办法可以实现这一目标。我一直在使用计数器来确定 window 是否应该打开,但我认为它不正确。
from tkinter import *
window = Tk()
count = 0
def openNewWindow():
global count
count = count + 1
if count == 1:
newWindow = Toplevel(window)
newWindow.title("New Window")
newWindow.geometry("800x800")
newWindow.title('test ©') # Frame title
newWindow.iconbitmap('icon4.ico') # Frame logo
if 'normal' == newWindow.state():
count = 2
else:
count = 0
width = window.winfo_screenwidth()
height = window.winfo_screenheight()
window.geometry("%dx%d" % (width, height))
bg = PhotoImage(file="bsor.gif")
label_image = Label(window, image=bg)
label_image.place(x=0, y=0)
title_label = Label(window, text="Job Management System", bg="black", fg="white")
title_label.config(font=("Courier", 70))
title_label.place(x=65, y=3)
customer_database_button = Button(window, text="Customer Database", width="23", height="2",
font=('Courier', 13, 'bold'), command=openNewWindow)
customer_database_button.grid(row=3, column=0, pady=185, padx=(110, 0))
employee_database_button = Button(window, text="Employee Database", width="23", height="2",
font=('Courier', 13, 'bold'))
employee_database_button.grid(row=3, column=1, pady=10, padx=(50, 0))
job_category_button = Button(window, text="Job Category (Pricing)", width="23", height="2",
font=('Courier', 13, 'bold'))
job_category_button.grid(row=3, column=2, pady=10, padx=(50, 0))
quote_sale_button = Button(window, text="Quotes / Sales", width="23", height="2", font=
('Courier', 13, 'bold'))
quote_sale_button.grid(row=3, column=3, pady=10, padx=(50, 0))
cash_management_button = Button(window, text="Cash Management", width="23", height="2", font=
('Courier', 13, 'bold'))
cash_management_button.grid(row=3, column=4, pady=10, padx=(50, 0))
analysis_mode_button = Button(window, text="Analysis Mode", width="23", height="2", font=
('Courier', 13, 'bold'))
analysis_mode_button.grid(row=3, column=5, pady=10, padx=(50, 0))
window.title('test') # Frame title
window.iconbitmap('icon4.ico') # Frame logo
window.mainloop()
这是一个关于如何做到这一点的最小示例(最好只允许一个额外的 window):
from tkinter import Tk, Toplevel, Button
def open_window(button):
button.config(state='disabled')
top = Toplevel(root)
top.transient(root)
top.focus_set()
top.bind('<Destroy>', lambda _: btn.config(state='normal'))
root = Tk()
root.geometry('300x200')
btn = Button(root, text='Open new window!', command=lambda: open_window(btn))
btn.pack(expand=True)
root.mainloop()
只需让函数禁用按钮并将 <Destroy>
事件绑定到 Toplevel
即可将按钮的状态设置回正常状态。 (另外你可能想在 Toplevel
上使用 .transient
使它出现在它的主人之上,这样人们就不会忘记他们还没有关闭 window 并且想知道为什么他们可以'按下按钮(它也不会在任务栏中显示额外的图标))
还有:
我强烈建议在导入内容时不要使用通配符 (*
),您应该导入您需要的内容,例如from module import Class1, func_1, var_2
等等或导入整个模块:import module
然后你也可以使用别名:import module as md
或类似的东西,关键是不要导入所有东西,除非你真的知道你在做什么;名称冲突是问题所在。
我强烈建议关注 PEP 8 - Style Guide for Python Code。函数和变量名称应在 snake_case
中,class 中的名称应在 CapitalCase
中。如果用作关键字参数 (func(arg='value')
) 的一部分,则在 =
周围不要有 space,但如果它用于 =
,则在 =
周围有 space赋值 (variable = 'some value'
)。在运算符周围有 space(+-/
等:value = x + y
(此处除外 value += x + y
))。在函数和 class 声明周围有两个空行。