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.sleepその上、 inを使用するの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()
于 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 に答える