Как отключить кнопки в Ткинтере? - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь сделать калькулятор с помощью модуля 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)

Это мой код.

Ответы [ 3 ]

1 голос
/ 31 января 2020

Я подозреваю, что вы уже создали все эти кнопки вне функции выключения и просто не понимаете, как настроить кнопку, и думаете, что переопределение кнопки будет делать то, что вы хотите. Это не будет. например, btnoff = Button(...) должно быть btnoff.config(state='disabled')

Тем не менее я считаю, что лучший подход - перебирать все виджеты в контейнере win и динамически отключать их.

Как указал Брайан в комментариях есть одна проблема с этим подходом, если ваша кнопка 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()

Теперь с включенным и кнопки выключения:

enter image description here enter image description here

0 голосов
/ 31 января 2020

Как я уже сказал в комментарии, вы должны сохранить все кнопки, созданные в контейнере, чтобы вы могли обращаться к ним по мере необходимости, например, когда вы хотите изменить их состояние.

Вот пример того, как чтобы сделать это, сохраняя их в 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()

Вот скриншоты, показывающие, как все выглядит до и после нажав на кнопку Toggle , чтобы изменить состояние остальных:

before and after screenshot

0 голосов
/ 31 января 2020

Это то, что вам нужно:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...