条目配置错误

时间:2013-07-19 02:38:23

标签: python widget tkinter tk

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

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

提前致谢!

2 个答案:

答案 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意味着无需定义一个完整的命名函数,只需使用一次。