wx.CheckListBox: memorizzare stato items
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:
Commenti recenti