我正在使用很多用户可更改选项的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)
...
是否有更有效的方式(就代码长度而言)来处理多个复选框,实际上所有这些复选框仅更改一个变量,然后调用一个相同的函数?我的方法虽然工作正常,但似乎有很多不必要的重复?
当然,一种方法是完全跳过“额外”变量-但是,实际上,我需要将这些变量与小部件分开-因为即使小部件被销毁,我也需要值(关闭选项后框架)。
所有建议将不胜感激。
您可能要编辑问题标题,“处理多个更改一个变量的复选框”,因为它似乎不适合以下文本。似乎有多个变量。在这种情况下,最简单的方法之一是将变量名和值存储在字典中,并使用事件对象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()