wxPython:更改组合框选项

wxPython : Change ComboBox choices

如果用户在第一个 wx.ComboBox 中选择 "Campaign",我将尝试更改第二个 wx.ComboBox 的选择。

下面的代码不起作用,我的意思是第二个 wx.ComboBox 的选择保持不变。

我需要你的帮助。谢谢,

class Test(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id, "Frame aka Window", style= wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX, size=(400, 635))


        self.filterValues = ['Campaign','Spent', 'Network Impr.', 'Network Clicks', 'Rev. /1000', 'GA Impr.', 'Revenue', 'eCPC', 'CPC', 'CTR'] 
        self.filterComboColumns = wx.ComboBox(self.panel,choices = self.filterValues, size = (100,-1))
        self.Bind(wx.EVT_COMBOBOX, self.onComboValues, self.filterComboColumns)

        self.filterContainsValues = ['Contains', 'Doesn\'t contain' , '<', '>'] 
        self.filterComboContains = wx.ComboBox(self.panel,choices = self.filterContainsValues, size = (100,-1))
        self.filterComboContains.Enable(False)
        self.Bind(wx.EVT_COMBOBOX, self.onComboContains, self.filterComboContains)

        self.filterInput = wx.TextCtrl(self.panel, wx.ID_ANY, size=(145, 24))
        self.filterInput.Enable(False)
        self.filterInput.SetFont(font)
        self.Bind(wx.EVT_TEXT, self.onComboInput, self.filterInput)

    def onComboValues(self, event): 
      cb = event.GetEventObject() 

      if cb.GetValue() == "Campaign":
        self.filterComboContains.Enable(True)
        self.filterContainsValues = []
        self.filterContainsValues.append('Contains')
        self.filterContainsValues.append('Doesn\'t contain')

您只缺少对 Set 方法的调用。更改包含选项的列表是不够的,您需要告诉 wx.ComboBox 列表已更改。 Set 方法就是执行此操作的方法。

带注释的代码 (####):

import wx

class Test(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, "Frame aka Window", style= wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX, size=(400, 635))

        self.panel = wx.Panel(self)

        self.filterValues = ['Campaign','Spent', 'Network Impr.', 'Network Clicks', 'Rev. /1000', 'GA Impr.', 'Revenue', 'eCPC', 'CPC', 'CTR'] 
        self.filterComboColumns = wx.ComboBox(self.panel, choices = self.filterValues, size = (100,-1))
        self.Bind(wx.EVT_COMBOBOX, self.onComboValues, self.filterComboColumns)

        self.filterContainsValues = ['Contains', 'Doesn\'t contain' , '<', '>'] 
        self.filterComboContains = wx.ComboBox(self.panel,choices = self.filterContainsValues, size = (100,-1))
        self.filterComboContains.Enable(False)
        #self.Bind(wx.EVT_COMBOBOX, self.onComboContains, self.filterComboContains)

        self.filterInput = wx.TextCtrl(self.panel, wx.ID_ANY, size=(145, 24))
        self.filterInput.Enable(False)
        #self.filterInput.SetFont(font)
        #self.Bind(wx.EVT_TEXT, self.onComboInput, self.filterInput)

        #### Sizer
        self.sizer = wx.BoxSizer()
        self.sizer.Add(self.filterComboColumns)
        self.sizer.Add(self.filterComboContains)
        self.sizer.Add(self.filterInput)
        self.panel.SetSizer(self.sizer)

    def onComboValues(self, event): 
        cb = event.GetEventObject() 

        if cb.GetValue() == "Campaign":
            self.filterComboContains.Enable(True)
            self.filterContainsValues = []
            self.filterContainsValues.append('Contains')
            self.filterContainsValues.append('Doesn\'t contain')
            #### The line below is the line you were missing
            self.filterComboContains.Set(self.filterContainsValues)
            #### This is to avoid showing an empty field when the values change
            self.filterComboContains.SetSelection(0)
        else:
            pass


# Run the program
if __name__ == "__main__":
    app = wx.App()
    frame = Test(None, 1)
    frame.Show()
    app.MainLoop()