2013-07-19 50 views
1

我有需要改变widget的状态的程序,但问题是我不断收到此错误:入门配置错误

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

pack什么也没有返回。所以现在进入是None。另外,在tk中使用time.sleep不是一个好的选择。您可以使用:

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

你的问题是,Entrypack方法实际上返回None,而不是entrybox。您可以将print(entry)放在您定义entry的行的正下方来查看。它将在终端中打印None。要解决这个问题,把pack在它自己的路线是这样的:

entry = Entry(root, fg='blue', textvariable=check_var) 
entry.pack(side=TOP) 

现在,entry指entrybox像它应该,而不是entrybox的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意味着没有需要定义一个名为全功能仅仅使用一次。

+0

虽然你说的是真的,代码的作用,你没有解决真正的问题是什么(提示:它与使用拉姆达无关) –

+0

@BryanOakley:谢谢你的提示。让我添加一个101。 – iCodez