是否有一种有效的方法来处理多个复选框,从而更改wxPython中的一个变量?

问题描述 投票:1回答:1

我正在使用很多用户可更改选项的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个回答
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()

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.