【问题标题】:How can I dynamically update ttk.combobox?如何动态更新 ttk.combobox?
【发布时间】:2015-09-03 21:31:58
【问题描述】:

我正在 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的函数。

我做错了什么?

【问题讨论】:

    标签: python-3.x combobox tkinter


    【解决方案1】:

    你可以用一个简单的lambda函数完成你的作业。

    valuetypes = ["bla1", "bla2", "bla3"]
    datatypes = ttk.Combobox(..., values=valuetypes, 
                              postcommand=lambda: datatypes.configure(values=valuetypes), ...) 
    
    valuetypes.append["another bla"] 
    

    当您单击Combobox 的向下箭头时,更改将出现在下拉菜单中。

    【讨论】:

      【解决方案2】:

      您在创建组合框时调用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() 函数。您要么尝试将所有内容塞入小部件的配置中,要么将其放入函数中。将其放入函数中更加明确,并且随着时间的推移更易于调试和维护。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-13
        • 1970-01-01
        • 1970-01-01
        • 2016-05-14
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多