对于我正在编写的代码,我试图将其设置为在Tkinter用户界面中,当您按下一个按钮时,该按钮变为禁用;当您在另一个按钮被禁用的情况下按下一个按钮时,当前禁用的按钮将再次变为启用状态。在
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语句之前看到每个按钮的当前状态。在
当UI上的每个按钮被禁用时,其状态值仍然是'normal'
。所以很明显有什么不对劲,但我不确定那是什么。在
如果您检查},这意味着If语句总是失败的。您需要将其转换为字符串才能进行实际比较。在
buttons[index]['state']
的类型,您将看到它是<class '_tkinter.Tcl_Obj'>
不是{顺便说一下,您已经在使用for循环了。好好利用它。在这个循环中不需要
^{pr2}$i
。在您使用的是来自ttk的
Button
类,而不是tkinter。它的state属性是一个对象,而不是一个字符串。在要测试ttk小部件是否处于特定状态,可以使用
instate
方法。例如:您还可以使用
state
方法,它返回状态。ttk状态比tk状态更复杂,因此您将得到一个列表。例如,buttons[i].state()
将返回('disabled',)
另外,您是否知道可以在不使用索引的情况下遍历按钮?这将使您的代码更易于阅读:
^{pr2}$相关问题 更多 >
编程相关推荐