wxPython: update CheckListBox
26 Febbraio 2011
stavo sperimentando con wx e con le checklistbox.
Il fatto di dover aggiornare il contenuto di una checklistbox, senza distruggerla per poi ricrearla, mi ha creato un po’ di problemi.
Se si ha a che fare con i sizers, nel momento in cui si ricrea la CLB per aggiornarne i contenuti, questa perde l’allineamento dato in precedenza.
Si potrebbe chiudere tutta la view, compresi frame, panel, sizers e widgets vari e poi ricrearli, ma è una soluzione orribile.
Il metodo migliore, per le mie capacità (scarsine di apprendista), rimane il metodo Clear() della CLB e l’AppendItems(NuovaListaValori) subito dopo.
Ecco un esempio, dove ho cercato di utilizzare un quasi-pattern MVC:
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.button = wx.Button(self.panel, 1, 'Change') 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.button, 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.createView(list_a) def createView(self, list): self.list = list self.view = View(None) self.view.createWidgets(self.list) self.view.SizerizeWidgets() self.view.button.Bind(wx.EVT_BUTTON, self.onClick) self.view.Show() def onClick(self, evt): list_b = self.model.get_b() self.view.box.Clear() self.view.box.AppendItems(list_b) if __name__ == '__main__': app = wx.App(False) controller = Controller(app) app.MainLoop()
I consigli sono supergraditi.
Categorie:wxpython
Commenti recenti