2011-07-29 177 views
8

私はArch Linux x86_64でPython 3.2.1を使用しています。 これは本当に私を夢中にさせています。グリッド化するとただちにttk.Comboboxの既定の事前選択された値が必要です。これは私のコードです:ttk Comboboxのデフォルト値を設定する

from tkinter import Tk, StringVar, ttk 

root = Tk() 

def combo(parent): 
    value = StringVar() 
    box = ttk.Combobox(parent, textvariable=value, state='readonly') 
    box['values'] = ('A', 'B', 'C') 
    box.current(0) 
    box.grid(column=0, row=0) 

combo(root) 

root.mainloop() 

空を描くのはComboboxです。私は、関数を使用する必要があり、実際のプログラムでは、もちろん

from tkinter import Tk, StringVar, ttk 

root = Tk() 

value = StringVar() 
box = ttk.Combobox(root, textvariable=value, state='readonly') 
box['values'] = ('A', 'B', 'C') 
box.current(0) 
box.grid(column=0, row=0) 

root.mainloop() 

ので、私は別のソリューションが必要です:どのような面白いのは、私が機能を使用しない場合、それは完璧に動作していることです。

答えて

23

問題は、StringVarのインスタンスがガベージコレクションされていることです。これは、コードをどのように記述したかに起因するローカル変数であるためです。

from tkinter import Tk, StringVar, ttk 

class Application: 

    def __init__(self, parent): 
     self.parent = parent 
     self.combo() 

    def combo(self): 
     self.box_value = StringVar() 
     self.box = ttk.Combobox(self.parent, textvariable=self.box_value, 
           state='readonly') 
     self.box['values'] = ('A', 'B', 'C') 
     self.box.current(0) 
     self.box.grid(column=0, row=0) 

if __name__ == '__main__': 
    root = Tk() 
    app = Application(root) 
    root.mainloop() 
+0

ありがとう、それは完璧に動作します!実際には私のアプリでクラスを使っていましたが、私は 'box_value'にローカル変数を使っていました。 "self.box_value'でそれはトリックです;) – kynikos

+0

私はttkをインポートすると申し訳ありませんが、" Combobox "をオプションまたはウィジェットとして認識しません。何か案は? – texasman1979

+0

@ texasman1979、どのバージョンのPythonを使用していますか、どのOSですか? 'ttk .__ file__'をチェックして、正しい' ttk'モジュールであることを確認してください。 – eryksun

4

あなたの関数「コンボ」終了、ローカル変数「値が」破壊された場合:

一つの解決策は、あなたのSTRINGVARが解消されないようにクラスを使用することです。大域変数やクラスのプロパティである変数のような永続変数が必要なので、ウィジェットがまだ存在する間に値がガベージコレクションされません。

+0

技術的な説明をありがとう^^ – kynikos

0

get()メソッドを関数内で使用すると、StringVarの名前を変更し、別の名前で保存してガベージコレクションを介して完全に失われないようにすることができます。

値= STRINGVAR()

keepvalue = value.get()

次いで 'keepvalue' の代わりに値を使用:

ボックス= ttk.Combobox(根、textvariable = keepvalue、状態= 'readonly')

これは私のためにコンボボックスに表示されていました。

関連する問題