[英]How to Disable buttons in Tkinter?
我正在嘗試使用 tkinter 模塊制作一個計算器,當我按下“關閉”按鈕時,我需要禁用所有按鈕,但我的代碼不起作用。 我不知道為什么。
def off():
btnoff = Button(win,command = off,state=DISABLED)
btn1 = Button(win,command=lambda:add(1),state=DISABLED)
btn2 = Button(win,command=lambda:add(2),state=DISABLED)
btn3 = Button(win,command=lambda:add(3),state = DISABLED)
btn4 = Button(win,command=lambda:add(4),state = DISABLED)
btn5 = Button(win,command=lambda:add(5),state = DISABLED)
btn6 = Button(win,command=lambda:add(6),state = DISABLED)
btn7 = Button(win,command=lambda:add(7),state = DISABLED)
btn8 = Button(win,command=lambda:add(8),state = DISABLED)
btn9= Button(win,command=lambda:add(9),state = DISABLED)
btn0 = Button(win,command=lambda:add(0),state = DISABLED)
btn40 = Button(win,state = DISABLED)
btnclear = Button(win,command = clear,state = DISABLED )
btnequal = Button(win,command =equal,state = DISABLED)
btnadd = Button(win,command =add,state = DISABLED)
btndivide = Button(win,command = divide,state = DISABLED)
btnsubtract = Button(win,command = subtract,state = DISABLED)
btn00 = Button(win,state = DISABLED)
這是我的代碼。
我懷疑您已經在關閉功能之外創建了所有這些按鈕,只是不了解如何配置按鈕並認為重新定義按鈕會做您想要的。 它不會。 例如btnoff = Button(...)
應該是btnoff.config(state='disabled')
也就是說,我認為最好的方法是遍歷win
容器中的所有小部件並動態禁用它們。
正如 Bryan 在評論中指出的,這種方法的一個問題是您的On
按鈕是否在同一個容器中。 在這種情況下,您可以編寫一個條件來檢查按鈕是否為開啟按鈕,然后選擇如何處理其狀態。
例如:
import tkinter as tk
root = tk.Tk()
def off():
widgets = root.winfo_children()
for widget in widgets:
if widget['text'] != 'On':
widget.config(state='disabled')
else:
widget.config(state='normal')
def on():
widgets = root.winfo_children()
for widget in widgets:
if widget['text'] != 'On':
widget.config(state='normal')
else:
widget.config(state='disabled')
for i in range(4):
btn = tk.Button(root, text='Button {}'.format(i), state='disabled')
btn.pack()
off_btn = tk.Button(root, text='Off', command=off, state='disabled')
on_btn = tk.Button(root, text='On', command=on)
off_btn.pack()
on_btn.pack()
root.mainloop()
現在有開和關按鈕:
這就是你需要的:
def off():
btnoff.config(state=DISABLED)
btn1.config(state=DISABLED)
btn2.config(state=DISABLED)
btn3.config(state=DISABLED)
btn4.config(state=DISABLED)
btn5.config(state=DISABLED)
btn6.config(state=DISABLED)
btn7.config(state=DISABLED)
btn8.config(state=DISABLED)
btn9.config(state=DISABLED)
btn0.config(state=DISABLED)
btn40.config(state=DISABLED)
btnclear.config(state=DISABLED)
btnequal.config(state=DISABLED)
btnadd.config(state=DISABLED)
btndivide.config(state=DISABLED)
btnsubtract.config(state=DISABLED)
btn00.config(state=DISABLED)
但最好是通過def off
按鈕列表。 然后它會是這樣的:
def off(btns):
for btn in btns:
btn.config(state=DISABLED)
正如我在評論中所說,您應該保存在容器中創建的所有按鈕,以便您可以根據需要引用它們——例如當您想要更改它們的狀態時。
下面是一個示例,說明如何通過將它們存儲在list
來做到這一點,並說明如何檢索和更改每個Button
的當前狀態。
import tkinter as tk
from tkinter.constants import *
def toggle(btns):
""" Flip state of each Button widget in btns between normal and disabled. """
for btn in btns:
new_state = DISABLED if btn.cget('state') == NORMAL else NORMAL
btn.config(state=new_state)
root = tk.Tk()
# Create Buttons and store them in a list.
btns = []
for i in range(1, 5):
btn = tk.Button(root, state=NORMAL, text='Button {}'.format(i))
btn.pack()
btns.append(btn)
toggle_btn = tk.Button(root, text='Toggle', command=lambda: toggle(btns))
toggle_btn.pack()
root.mainloop()
以下屏幕截圖顯示了單擊“切換”按鈕以翻轉其他按鈕之前和之后的樣子:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.