Python ttk.按钮状态更改有时不起作用

Python ttk.按钮状态更改有时不起作用,python,tkinter,ttk,Python,Tkinter,Ttk,我一直在构建一个程序,在试图更改ttk.Button()的状态时,遇到了一个奇怪的响应。到目前为止,一切都很顺利,但后来我遇到了一些问题,发现在创建ttk.Button()时,state选项实际上不是一个选项。我知道如何使用Style()等更改它。然而,当创建ttk.Entry()对象时,它接受状态作为选项并相应地设置它。奇怪的反应是当你试图用另一个按钮改变状态时 这是一个代码,其中状态已定义为已禁用-这表明该选项已被接受。但该功能不起作用。至少对我来说 import tkinter as tk

我一直在构建一个程序,在试图更改
ttk.Button()
的状态时,遇到了一个奇怪的响应。到目前为止,一切都很顺利,但后来我遇到了一些问题,发现在创建
ttk.Button()
时,
state
选项实际上不是一个选项。我知道如何使用Style()等更改它。然而,当创建
ttk.Entry()
对象时,它接受状态作为选项并相应地设置它。奇怪的反应是当你试图用另一个按钮改变状态时

这是一个代码,其中
状态
已定义为
已禁用
-这表明该选项已被接受。但该功能不起作用。至少对我来说

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

def change_state():
    if button1['state'] == 'disabled':
        button1['state'] = 'normal'
    elif button1['state'] == 'normal':
        button1['state'] = 'disabled'

button1 = ttk.Button(root, state='disabled', text='test')
button1.pack()

button2 = ttk.Button(root, text='change state', command=change_state)
button2.pack()

root.mainloop()
在这里,我做了一些随机修改,并在函数中添加了另一行

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

def change_state():
    print(button1['state'])
    if button1['state'] == 'disabled':
        button1['state'] = 'normal'
    elif button1['state'] == 'normal':
        button1['state'] = 'disabled'

button1 = ttk.Button(root, state='disabled', text='test')
button1.pack()

button2 = ttk.Button(root, text='change state', command=change_state)
button2.pack()

root.mainloop()

现在不知从何而来,这个函数起作用了。尽管首先什么都不应该起作用,因为
状态
不被接受为选项,因此不能以标准方式进行配置。其他任何人在运行这两个版本时都有相同的响应。谁能解释一下发生了什么事?我认为同样的情况也适用于
ttk.Entry()
,也可能适用于其他人。

通过
button[state]
返回的值不是python
str
,因此通过执行
button1['state']='disabled'
总是会出现错误。可以使用
类型(按钮1['state'])
进一步检查它,该按钮返回

def change_state():
如果str(按钮1['state'])=='disabled':
按钮1[“状态”]=“正常”
elif str(按钮1[“状态])==“正常”:
按钮1[“状态”]=“已禁用”

ttk.按钮的
state
选项仅用于向后兼容,并且是只写的-它不能完全正常工作,因为ttk对小部件状态的概念不兼容,它由大约十个不同的标志组成,这些标志可以取独立的值。我认为如果您使用一个单独的变量来跟踪状态,而不是试图从按钮读回状态,那么您的
change\u state()。使用ttk执行此操作的正确方法是使用
.state()
.instate()
方法-抱歉,手头没有它们的使用示例。对于我(在Linux中),这两个版本都不起作用,按钮保持禁用状态。下面是一个如何使用
.state()
设置状态的简短示例。但是,您实际上如何检查状态并生成if/else逻辑?