簡體   English   中英

如何禁用 Tkinter 中的按鈕?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM