Home > wxpython > wx.CheckListBox: memorizzare stato items

wx.CheckListBox: memorizzare stato items

1 Marzo 2011

Mettiamo di avere una checklistbox, nella quale visualizzo,
alternativamente, tramite radiobox, due differenti serie di valori.

Il problema è quello di mantenere lo stato degli items di una lista,
quando la checklistbox, passa a visualizzare la seconda lista, e poi
torna sulla prima.

Questa cosa la si può ottenere immagazzinando nome e id degli item
selezionati in un dizionario di appoggio.
Switchando tra le 2 liste, riprenderò gli items dal dizionario
e tramite i loro id, li ri-settero’ attivi nella checklistbox,
con il metodo Check(id, True).

Di seguito il codice:

import wx

class Model:
    def __init__(self):
        self.list_a = ['a', 'b', 'c', 'd']
        self.list_b = ['e', 'f', 'g', 'h']

    def get_a(self):
        return self.list_a

    def get_b(self):
        return self.list_b
    
class View(wx.Frame):

    def __init__(self, parent):
        wx.Frame.__init__(self, None, -1, '', size=(200, 200))

    def createWidgets(self, list):
        self.panel = wx.Panel(self, -1)
        self.radiobox = wx.RadioBox(self.panel, -1, "Lists", (20, 20),
                                    wx.DefaultSize, ['a', 'b'], 1, wx.RA_SPECIFY_COLS)
        self.box = wx.CheckListBox(self.panel, -1, size = ( 100, 50 ),
                                   choices = list, style = wx.LB_HSCROLL)

    def SizerizeWidgets(self):
        self.vbox = wx.BoxSizer(wx.VERTICAL)
        self.vbox.Add(self.box, 1, wx.ALIGN_CENTRE)
        self.vbox.Add(self.radiobox, 1, wx.ALIGN_CENTRE)
        self.panel.SetSizer(self.vbox)
        self.Centre()
        
class Controller:
    def __init__(self, app):
        self.model = Model()
        list_a = self.model.get_a()
        self.dict_checked = {} # dizionario sul quale memorizzo i valori scelti dalla clb
        self.createView(list_a)

    def createView(self, list):
        self.list = list
        self.view = View(None)
        self.view.createWidgets(self.list)
        self.view.SizerizeWidgets()
        self.view.radiobox.Bind(wx.EVT_RADIOBOX, self.onRadioClick)
        self.view.box.Bind(wx.EVT_CHECKLISTBOX, self.onBoxClick)
        self.view.Show()

    def onRadioClick(self, evt):
        id_list = self.view.radiobox.GetSelection()
        if self.view.radiobox.GetSelection() == 0:
            list = self.model.get_a()
        else:
            list = self.model.get_b()
        self.view.box.Clear()
        self.view.box.AppendItems(list)
        # Qui controllo se ho gia' selezionato in precedenza dei valori
        # per riattivarli, switchando da una lista all'altra
        for item in self.dict_checked: #se ho un item nel diz
            if item in self.view.box.GetItems():            # lo cerco nella clb
                id = (self.view.box.GetItems()).index(item) # estrapolo l'id
                self.view.box.Check(id, True)               # riaccendo l'item nella clb
            else:
                continue                                    # salto all'item successivo del diz

    def onBoxClick(self, evt):
	# qui aggiungo l'item al diz di appoggio
        if self.view.box.IsChecked(evt.GetSelection()):
            print "%s --> selezionato" %self.view.box.GetString(evt.GetSelection())
            self.dict_checked[self.view.box.GetString(evt.GetSelection())] = \
            (self.view.box.GetItems()).index(self.view.box.GetString(evt.GetSelection()))
	# qui rimuovo l'item dal diz quando ricliccato
        else:
            print "%s --> scartato" %self.view.box.GetString(evt.GetSelection())
            self.dict_checked.pop(self.view.box.GetString(evt.GetSelection()))
    
if __name__ == '__main__':
    app = wx.App(False)
    controller = Controller(app)
    app.MainLoop()

in pratica, cliccando sul\sugli item della checklistbox, con il metodo
legato all’evento wx.EVT_CHECKLISTBOX, onBoxClick(), aggiungo al dizionario
di appoggio, il valore e l’indice corrispondente, e lo rimuovo se deselezionato.

dopo dichè, cliccando sul radio box, tramite il metodo legato all’evento
wx.EVT_RADIOBOX, onRadioClick(), controllo se, nel mio dizionario di appoggio, ci sono
elementi presenti nella lista visualizzata nella checklistbox. Se presente, lo riattivo
nella checklistbox, tramite il proprio id (immagazzinato in precedenza), con il metodo
Check(id, True).

magari non sarà un codice ultra snello, ma svolge bene il suo compito:




Categorie:wxpython Tag:
I commenti sono chiusi.