2011-07-29 280 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的實例正在被垃圾收集。這是因爲你是如何編寫代碼的,這是一個局部變量。

一個解決方案是讓你的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,以及哪個操作系統?檢查'ttk .__ file__'以確保它是正確的'ttk'模塊。 – eryksun

4

當你的函數「二合一」退出,局部變量「價值」被破壞。您需要一個持久變量,例如全局變量或屬於類的屬性的變量,以便在該小部件仍然存在時不會進行垃圾回收。

+0

感謝您的技術解釋^^ – kynikos

0

函數中可以使用get()方法重命名StringVar並將其另存爲其他名稱以避免通過垃圾回收完全丟失它。

值= STRINGVAR()

keepvalue = value.get()

然後使用代替值 'keepvalue':

盒= ttk.Combobox(根,textvariable = keepvalue,狀態='只讀')

這個'A'顯示在組合框中。