如何动态更新ttk.combobox?

时间:2015-09-03 21:31:58

标签: python-3.x combobox tkinter

我在Windows 8计算机上使用Python 3.4和Tkinter创建GUI。

GUI顶部有一些Entry输入,然后是一些组合框。我希望组合框从以前的输入(文件名,找到必要信息的行,分隔符类型等)描述的文本文件中获取选项列表。我正在尝试使用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.delim2self.fcd2_text是以前的一些输入。它们是StringVar。

当我运行此代码时,组合框有选项test,working?和两个空行(可能是flnmhl)。我计划有多个这样的组合框,只是输入不同,所以我需要一个函数,我可以给输入,然后更新datatypes

我做错了什么?

2 个答案:

答案 0 :(得分: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应该是什么。您将其定义为空列表,然后将其重置为窗口小部件本身。无论如何,这显示了一般概念。

通过为每个组合框提供一个函数,您可能看起来有很多重复的代码,但您必须在某处调用所有get()函数。您要么尝试将所有内容都塞进窗口小部件的配置中,要么将其放入函数中。将它放在函数中更明确,更容易调试和维护。

答案 1 :(得分:0)

实际上,您不需要这种工作。您可以通过简单的lambda function完成作业。

valuetypes=["bla", "bla","bla"]
datatypes = ttk.Combobox(..., values=valuetypes, 
                          postcommand=lambda: datatypes.confiure(values=valuetypes), ...)

valuetypes.append["another bla"]

单击Combobox的向下箭头时,更改将显示在下拉菜单中。