wxPython:更改组合框选择

时间:2019-05-31 05:13:02

标签: wxpython

如果用户在第一个wx.ComboBox中选择“广告系列”,我将尝试更改第二个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')

1 个答案:

答案 0 :(得分:2)

您仅缺少对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()