我有一个程序需要更改窗口小部件的状态,但问题是我一直收到此错误:
Traceback (most recent call last):
File "C:\Users\Public\Documents\Programming\Spellox\Spellox.py", line 67, in <module>
new_word()
File "C:\Users\Public\Documents\Programming\Spellox\Spellox.py", line 37, in new_word
entry['state'] = DISABLED
TypeError: 'NoneType' object does not support item assignment
这里的任何人都可以帮助我输入小部件的代码:
from tkinter import *
import time
root = Tk()
entry = Entry(root, fg='blue', textvariable=check_var).pack(side=TOP)
def change():
time.sleep(3)
entry['state'] = DISABLED
change()
root.mainloop()
提前致谢!
答案 0 :(得分:2)
pack
什么都不返回。所以现在输入是None
。此外,在time.sleep
中使用tk
不是一个好选择。你可以使用:
from tkinter import *
root = Tk()
check_var = StringVar()
entry = Entry(root, fg='blue', textvariable=check_var)
def change():
entry['state'] = DISABLED
entry.after(3000, change)
entry.pack(side=TOP)
root.mainloop()
答案 1 :(得分:2)
您的问题是pack
Entry
方法实际返回None
,而不是输入框。您可以将print(entry)
放在您定义entry
的行的正下方。它将在终端中打印None
。要解决此问题,请将pack
放在它自己的行上,如下所示:
entry = Entry(root, fg='blue', textvariable=check_var)
entry.pack(side=TOP)
现在,entry
指的是输入框,而不是输入框的pack
方法。
此外,如果您计划在脚本中重复使用change
,那么将它放在命名函数中是一件好事。否则,我会这样做:
from tkinter import *
root = Tk()
check_var = StringVar()
entry = Entry(root, fg='blue', textvariable=check_var)
entry.pack(side=TOP)
entry.after(3000, lambda:entry.config(state=DISABLED))
root.mainloop()
它更简洁,使用lambda
意味着无需定义一个完整的命名函数,只需使用一次。