对于我正在编写的代码,我正在设置它,以便在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']))
所以我可以在检查if语句之前看到每个Buttons的当前状态。
在UI上的每个按钮被禁用时,状态值仍为'normal'
。显然有些事情是错的,但我不确定那是什么。
答案 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