多次点击按钮时只打开 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 声明周围有两个空行。