单击

时间:2017-07-21 17:04:12

标签: python tkinter

对于我正在编写的代码,我正在设置它,以便在Tkinter UI中,当您按下按钮时,按钮将被禁用,当您按下按钮而另一个按钮被禁用时,当前禁用的按钮再次启用。

import tkinter as tk
from tkinter import ttk

def btnPressed(index):
    print("Button {0} disabled".format(index))
    for i in range(len(buttons)):
        print("Button {0}, State: {1}".format(index, buttons[index]['state']))
        if buttons[i]['state'] == 'disabled':
            buttons[i].configure(state = 'normal')
    buttons[index].configure(state = 'disabled')


root = tk.Tk()
buttons = []
btn1 = ttk.Button(root, text = "Button 1", command = lambda: btnPressed(0))
btn1.pack()
buttons.append(btn1)
btn2 = ttk.Button(root, text = "Button 2", command = lambda: btnPressed(1))
btn2.pack()
buttons.append(btn2)
btn3 = ttk.Button(root, text = "Button 3", command = lambda: btnPressed(2))
btn2.pack()
buttons.append(btn3)
root.mainloop()

现在我可以得到它以便按钮自己禁用,但之后不会恢复到“正常”状态。我试着做一些错误测试

print("Button {0}, State: {1}".format(index, buttons[index]['state']))

在for循环中

所以我可以在检查if语句之前看到每个Buttons的当前状态。

在UI上的每个按钮被禁用时,状态值仍为'normal'。显然有些事情是错的,但我不确定那是什么。

2 个答案:

答案 0 :(得分:4)

您正在使用ttk而不是tkinter的Button类。它的状态属性是一个对象,而不是一个字符串。

要测试ttk小部件是否处于特定状态,您可以使用instate方法。例如:

if buttons[i].instate[["disabled",]]:
    ...

您还可以使用返回状态的state方法。 ttk状态比tk状态更复杂,所以你得到一个列表。例如,buttons[i].state()将返回('disabled',)

另外,您是否知道可以在不使用索引的情况下循环按钮?它将使您的代码更容易阅读:

for button in buttons:
    if button['state'] == ...

答案 1 :(得分:2)

如果您检查-F的类型,您会看到buttons[index]['state']而非<class '_tkinter.Tcl_Obj'>,这意味着您的if语句始终失败。您需要将其转换为字符串才能进行实际比较。

string

顺便说一下,你已经在使用for循环了。利用它。在那个循环中你不需要if str(buttons[i]['state']) == 'disabled':

i