Home > wxpython > wxPython: update CheckListBox

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 Tag:
I commenti sono chiusi.