[英]How to make a tkinter button open only one Toplevel?
我需要一個 tkinter 按鈕來僅打開一個 Toplevel,但我嘗試使用一個計數器在創建一個 Toplevel 時更改為 2,並使用一個 if 循環檢查計數器是否為 1,(如果為 1,它將創建一個 Toplevel window)
但是當我運行程序時,我可以通過多次單擊按鈕來制作許多 windows
我認為使用計數器的解決方案不起作用
def menu_window(self): # this is in a class
self.frame4 = tk.Frame(self.master, padx=30, pady=30)
self.frame4.grid()
Counter = 1 ### COUNTER
button2 = tk.Button(self.frame4, text="Review your Quiz", command=lambda: PreviewQuiz(self.master, self.frame4,
Counter))
button2.grid(row=3, column=2, padx=40, pady=15, ipadx=28)
button3 = tk.Button(self.frame4, text=" Start your Quiz ")
button3.grid(row=4, column=2, padx=40, pady=5, ipadx=30)
class PreviewQuiz:
def __init__(self, master, frame4, Counter):
if Counter == 1: # CHECK IF COUNTER IS 1
self.master = master
self.review_q = tk.Toplevel(self.master)
self.frame5 = tk.Frame(self.master, padx=50, pady=20)
self.frame5.grid()
self.Counter = 2 # SET COUNTER TO 2
只需在用戶單擊按鈕時禁用該按鈕,並僅在頂級關閉時啟用它。
下面是取自您在最新帖子中提供的代碼的示例:
import tkinter as tk
class Run:
def __init__(self, master):
self.master = master
self.button = tk.Button(master, text="TopLevel", command=self.make_new)
self.button.pack()
def make_new(self):
self.button['state'] = 'disabled'
new = tk.Toplevel(self.master)
lbl = tk.Label(new, text='only one topLevel')
lbl.pack()
new.protocol("WM_DELETE_WINDOW", lambda : self.button.configure(state='normal') or new.destroy()) # or make a method to change the state
master1 = tk.Tk()
i = Run(master1)
master1.mainloop()
您的代碼無法運行,這使得調試變得困難。 不過有幾點:
當您在menu_window()
中為counter
分配一個值時,您會以“.”結束該值,這使其成為浮點數,而不是 integer。
您使用 counter 參數調用PreviewQuiz
,但是當您更新計數器時,您會將其更改為PreviewQuiz
的實例變量,而不是menu_window()
class 的實例變量,因此下次調用PreviewQuiz
時,您仍將使用 1.0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.