2015-09-03 247 views
0

我在Windows 8計算機上使用Python 3.4和Tkinter創建GUI。如何動態更新ttk.combobox?

GUI具有在頂部的一些條目的輸入,然後一些組合框。我希望組合框從前面輸入(文件名,找到必要信息的行,分隔符類型等)描述的文本文件中獲取選項列表。我試圖使用postcommand,但它似乎首先運行並且從不更新,而不是每次訪問組合框的下拉菜單時更新。

datatypes = [] 
    datatypes = ttk.Combobox(tab_loc, textvariable=std1, values=datatypes, postcommand=self.get_datatypes(datatypes, 
      self.flnm2.get(), self.hl2_text.get(), self.delim2.get(), self.fcd2_text.get())).grid(pady=v_pad, 
      padx=h_pad, row=8, column=1, sticky=EW) 

    def get_datatypes(self, lst, flnm, hl, delim, fcd): 
     # Problem: postcommand runs at start of GUI. Prevents updating. 
     lst += ["test", "worked?"] 
     print("stuff") 
     lst += flnm 
     lst += hl 
     try: 
      # open the file, get the line, break it apart. 
     except: 
      pass 

self.flnm2self.hl2_textself.delim2,和self.fcd2_text是一些先前輸入。他們是StringVar。

當我運行此代碼時,組合框具有選項測試,工作?和兩個空白行(推測爲flnmhl)。我打算有這樣的多個組合框,只是有不同的輸入,所以我需要一個功能,我可以給輸入,然後更新datatypes

我在做什麼錯?

回答

0

您正在調用self.get_datatypes(...)並在創建組合框時將結果分配給postcommand屬性。這就是爲什麼它只運行一次:你告訴它。與command屬性一樣,您必須在定義postcommand屬性時參考一個函數。

爲每個組合框創建一個專門針對post命令的方法,爲您的postcommand使用對該命令的引用,然後在從其他窗口小部件中獲取值後,從該函數調用get_datatypes

它應該是這個樣子:

datatypes = ttk.Combobox(..., postcommand=self.combo_post_command, ...) 
... 
def combo_post_command(self): 
    flnm2 = self.flnm2.get() 
    hl2_text = self.hl2_text.get() 
    delim2 = self.delim2.get() 
    fcd2_text = self.fcd2_text.get() 
    return self.get_datatypes(datatypes, flnm2, hl2_text, delim2, fcd2_text) 

我不完全相信datatypes應該是。您將其定義爲空列表,然後將其重置爲小部件本身。無論如何,這顯示了一般概念。

看起來好像你有很多重複的代碼,每個組合框都有一個函數,但是你必須調用所有的函數。您可以嘗試將所有內容都塞進小部件的配置中,或者將其放入函數中。把它放在函數中更明確,並且隨着時間的推移更容易調試和維護。