2011-09-16 12 views
2

次のPython 3コードは、文字列(この例では「junk」)で正しく初期化されたラベルとエントリフィールドを持っています。しかし、2番目の "import"行のコメントを外して古いEntryウィジェットを新しいテーマウィジェットに置き換えると、ラベルとEntryフィールドは初期化されません。Pythonテーマtkinter:エントリ変数は設定されません

テーマウィジェットの初期化が壊れている理由を教えてください。


from tkinter import * 
# from tkinter.ttk import * 

class myApp: 
    def __init__(self, root): 
     v = StringVar() 
     v.set("junk") 

     label = Label(root, textvariable=v) 
     label.pack() 
     text_entry = Entry(root, textvariable=v) 
     text_entry.pack() 

root = Tk() 
root.title("MyApp") 
app = myApp(root) 
root.mainloop() 

答えて

5

問題はvがローカル変数であるということです。範囲外になると(__init__の実行が終了すると)vがガベージコレクションされています。 vself.vに変更すると問題が解決します。

ttk Entryウィジェットで問題が発生するのはなぜですか。標準ウィジェットではないことはわかりません。私はガベージコレクタに対してちょっと敏感だと思っています。あるいは両方のライブラリをインポートすると、どうやらガベージコレクタが早くトリガされます。それにもかかわらず、在庫ウィジェットを使用しても、最終的にはvは最終的にガベージコレクションされるため、何らかの問題が発生します。

関連する問題