1

我有一个程序需要更改小部件的状态,但问题是我不断收到此错误:

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()

提前致谢!

4

2 回答 2

2

pack什么都不返回。所以现在入口是一个None. 此外,使用time.sleepintk也不是一个好的选择。您可以使用:

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()
于 2013-07-19T02:41:38.743 回答
2

您的问题是实际返回的pack方法,而不是输入框。您可以通过将其放在您定义的行下方来看到这一点。它将在终端中打印。要解决此问题,请将其放在自己的行上,如下所示:EntryNoneprint(entry)entryNonepack

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方法不需要定义一个完整的命名函数,只是为了使用一次。

于 2013-07-19T21:12:44.637 回答