Есть ли эффективный способ обработки нескольких флажков, которые изменяют одну переменную в wx Python? - PullRequest
1 голос
/ 02 марта 2020

Я работаю над приложением wx Python с большим количеством пользовательских настроек. Это приводит к большому количеству флажков, которые нужно каким-то образом обрабатывать.

В то время мой код выглядит примерно так:

        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)
...

Есть ли более эффективный способ (в условия длины кода) обработки нескольких флажков, которые практически изменяют только одну переменную, а затем вызывают одну и ту же функцию? Мой подход, хотя и работает нормально, похоже, имеет много ненужных (?) Повторений.

Конечно, один из способов сделать это - вообще пропустить «лишнюю» переменную - однако на практике мне нужно иметь эти переменные отдельно от виджетов - так как мне нужны значения, даже если виджеты уничтожены (например, после закрытия рамки параметров).

Все советы будут оценены.

1 Ответ

1 голос
/ 02 марта 2020

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

...