【问题标题】:Is there an efficient way to handle multiple checkboxes that change one variable in wxPython?有没有一种有效的方法来处理改变 wxPython 中一个变量的多个复选框?
【发布时间】:2020-03-02 12:36:30
【问题描述】:

我正在开发一个 wxPython 应用程序,其中包含很多用户可更改的选项。这导致需要以某种方式处理大量复选框。

当时,我的代码如下所示:

        self.checkbox1=wx.CheckBox(self.panel,label='Do X')
        self.checkbox1.Bind(wx.EVT_CHECKBOX,self.DoXCheckboxHandler)
        self.checkbox1.SetValue(True)
        self.sizer.Add(self.checkbox1,0,wx.ALL|wx.EXPAND,5)

        self.checkbox2=wx.CheckBox(self.panel,label='Do Y')
        self.checkbox2.Bind(wx.EVT_CHECKBOX,self.DoYCheckboxHandler)
        self.checkbox2.SetValue(True)
        self.sizer.Add(self.checkbox2,0,wx.ALL|wx.EXPAND,5)
...
    def DoXCheckboxHandler(self,event):
        self.DoX=self.checkbox1.GetValue()
        self.RefreshUserView(self)

    def DoYCheckboxHandler(self,event):
        self.DoY=self.checkbox2.GetValue()
        self.RefreshUserView(self)
...

有没有更有效的方法(就代码长度而言)来处理多个复选框,这些复选框实际上只更改一个变量,然后调用一个相同的函数?我的方法虽然效果很好,但似乎有很多不必要的(?)重复。

当然,一种方法是完全跳过“额外”变量 - 但是,实际上我需要将这些变量与小部件分开 - 因为即使小部件被销毁,我也需要这些值(在关闭选项框架,例如)。

我们将不胜感激所有建议。

【问题讨论】:

    标签: event-handling wxpython


    【解决方案1】:

    您可能想要编辑问题标题,“处理更改一个变量的多个复选框”,因为它似乎不适合以下文本。似乎有多个变量。
    在这种情况下,最简单的方法之一是将变量名称和值存储在字典中,并使用事件对象 GetName() 函数更新值。
    这是一个例子:

    import wx
    import wx.lib.agw.ultimatelistctrl as ULC
    
    class MyFrame(wx.Frame):
        def __init__(self, parent):
            wx.Frame.__init__(self, parent, -1, "Days and Hours Checkbox Grid", size=(600,300))
            agwStyle = (ULC.ULC_HAS_VARIABLE_ROW_HEIGHT | wx.LC_REPORT | wx.LC_VRULES | wx.LC_HRULES | wx.LC_SINGLE_SEL)
            self.mylist = mylist = ULC.UltimateListCtrl(self, wx.ID_ANY, agwStyle=agwStyle)
    
            # Load headings
            mylist.InsertColumn(0,"Weekday", width=100)
            for col in range(1,25):
                col_num=str(col-1)
                mylist.InsertColumn(col,col_num, width=20)
    
            # Dictionary to Store checkbox variable names and values
            self.variables = {}
    
            # Load Side headings
            days=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
            for day in range(7):
                mylist.InsertStringItem(day, str(days[day]))
    
            # Load checkboxes
            for boxes in range(1,25):
                for index in range(7):
                    day = days[index]
                    hour = boxes-1
                    name_of_checkbox = "{day}_{hour}".format(day=day, hour=hour)
                    self.checkBox = wx.CheckBox(mylist, wx.ID_ANY, "", wx.DefaultPosition, wx.DefaultSize, 0,name=name_of_checkbox)
            # Store individual checkbox variable names and values in a dictionary
                    self.variables[name_of_checkbox] = False
    
                    mylist.SetItemWindow(index, boxes, self.checkBox)
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(mylist, 1, wx.EXPAND)
            button = wx.Button(self,-1,"Print Data")
            sizer.Add(button)
            self.Bind(wx.EVT_CHECKBOX, self.OnChecked)
            self.Bind(wx.EVT_BUTTON, self.OnGetData)
            self.SetSizer(sizer)
    
        def OnChecked(self,event):
            clicked = event.GetEventObject()
            variable_name = clicked.GetName()
            self.variables[variable_name] = event.IsChecked()
            if event.IsChecked():
                print(variable_name,"from False to True")
            else:
                print(variable_name,"from True to False")
    
        def OnGetData(self,event):
            for i,v in self.variables.items():
                print(i,v)
    
    app = wx.App()
    frame = MyFrame(None)
    frame.Show()
    app.MainLoop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多