Возможно, вы захотите отредактировать заголовок вопроса, «обрабатывать несколько флажков, которые меняют одну переменную», так как он не соответствует следующему тексту. Кажется, что существует несколько переменных.
В таком случае, один из самых простых способов - сохранить имена и значения переменных в словаре и обновить значение с помощью функции объектов 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()