在cli上禁用/启用Tkinter按钮

2024-10-01 09:23:20 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我正在编写的代码,我试图将其设置为在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'。所以很明显有什么不对劲,但我不确定那是什么。在


Tags: textformatindex状态buttonroot按钮state
2条回答

如果您检查buttons[index]['state']的类型,您将看到它是<class '_tkinter.Tcl_Obj'>不是{},这意味着If语句总是失败的。您需要将其转换为字符串才能进行实际比较。在

if str(buttons[i]['state']) == 'disabled':

顺便说一下,您已经在使用for循环了。好好利用它。在这个循环中不需要i。在

^{pr2}$

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

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

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

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

另外,您是否知道可以在不使用索引的情况下遍历按钮?这将使您的代码更易于阅读:

^{pr2}$

相关问题 更多 >