2015-09-03 249 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应该是。您将其定义为空列表,然后将其重置为小部件本身。无论如何,这显示了一般概念。

看起来好像你有很多重复的代码,每个组合框都有一个函数,但是你必须调用所有的函数。您可以尝试将所有内容都塞进小部件的配置中,或者将其放入函数中。把它放在函数中更明确,并且随着时间的推移更容易调试和维护。