Question related to wx and dynamically updating windows

Andy andy at start.no
Mon Oct 20 06:43:20 EDT 2008


I want to dynamically update a list of elements shown as a checkbox 
list. A file is used to store the elements, and elements can be added 
and deleted from the list. The trouble is that the window is not 
properly updated after deleting/adding items.

I use the Detach()/Destroy() to remove the sizer, and then I create a 
new and updated sizer again. Apparently, not in a correct way...


#################File createleftpanel.py############################
import wx
from gettext import gettext as _
from project import Project


"""
The class createLeftPanel
"""

class createLeftPanel(wx.Panel):

     def __init__(self, parent):
         wx.Panel.__init__(self, parent)

         #Initialization
         self.SetBackgroundColour('White')
         self.filename = 'tempfile.sim'

         #Initiate file:
         initList = ['alfa', 'bravo', 'ekko']
         Project(self.filename).writeProject(initList)
         readList = Project(self.filename).readProject()

         #Boxes
         self.mainbox = wx.BoxSizer(wx.VERTICAL)
         self.aSavedSizer = self.MakeSavedSizer(readList)

         #Adding everything to mainbox
         self.mainbox.Add(self.aSavedSizer, 0, wx.RIGHT | wx.LEFT, 3)

         self.mainbox.Fit(self)
         self.SetSizer(self.mainbox)
         self.Layout()

     def OnDelete(self, event):
         #Deleting element from file
         for counter in range(0, len(self.elementList)):
             if self.elementList[counter][0].GetValue() == True:
                 Project(self.filename).removeLineFromProject(\
                     self.elementList[counter][2])

         #Detaching and destroying the previous savedSizer
         self.mainbox.Detach(self.aSavedSizer)
         self.aSavedSizer.Destroy()

         #Adding new aSavedSizer from file
         aSavedList = Project(self.filename).readProject()
         self.aSavedSizer = self.MakeSavedSizer(aSavedList)
         self.mainbox.Add(self.aSavedSizer, 0, wx.RIGHT | wx.LEFT, 3)
         self.mainbox.Fit(self)
         self.SetSizer(self.mainbox)
         self.Layout()

     def OnAdd(self, event):
         #Adding element to file
         Project(self.filename).appendLineToProject(self.addText.GetValue())

         #Detaching and destroying the previous savedSizer
         self.mainbox.Detach(self.aSavedSizer)
         self.aSavedSizer.Destroy()

         #Adding new aSavedSizer from file
         aSavedList = Project(self.filename).readProject()
         self.aSavedSizer = self.MakeSavedSizer(aSavedList)
         self.mainbox.Add(self.aSavedSizer, 0, wx.RIGHT | wx.LEFT, 3)
         self.mainbox.Fit(self)
         self.SetSizer(self.mainbox)
         self.Layout()


     def MakeSavedSizer(self, savedList):

         #Putting saved items into static box together with checkbox for 
deleting
         savedBox = wx.StaticBox(self, -1, _('Saved words'))
         savedSizer = wx.StaticBoxSizer(savedBox, wx.VERTICAL)

         self.elementList = []
         for item in savedList:
             self.element = wx.CheckBox(self, -1, item, 
pos=wx.DefaultPosition, \
                                   size=wx.DefaultSize)
             print item
             self.elementList.append((self.element, 
self.element.GetId(), item))
             savedSizer.Add(self.element, 0, wx.ALL, 5)

         #Delete button
         deleteBox = wx.BoxSizer(wx.HORIZONTAL)
         deleteText = wx.StaticText(self, -1, '', size=(125,-1))
         deleteButton = wx.Button(self, -1, _('Delete'))
         deleteBox.Add(deleteText, 0, wx.ALL, 1)
         deleteBox.Add(deleteButton, 0, wx.ALL, 1)
         self.Bind(wx.EVT_BUTTON, self.OnDelete, deleteButton)

         #Add element + button
         addBox = wx.BoxSizer(wx.HORIZONTAL)
         self.addText = wx.TextCtrl(self, -1, value=_(''),  size = (125, 
-1), \
                                          validator=wx.DefaultValidator)
         self.addText.SetMaxLength(12)

         addButton = wx.Button(self, -1, _('Add'))
         addBox.Add(self.addText, 0, wx.ALL, 1)
         addBox.Add(addButton, 0, wx.ALL, 1)
         self.Bind(wx.EVT_BUTTON, self.OnAdd, addButton)


         #Add to savedSizer
         savedSizer.Add(deleteBox, 0, wx.EXPAND, 0)
         savedSizer.Add(addBox, 0, wx.EXPAND, 0)

         #self.SetSizer(savedSizer)
         self.Fit()

         return savedSizer


""" Testing routines for testing this module only"""
class Frame(wx.Frame):
     def __init__(self, parent):
         wx.Frame.__init__(self, parent=None, id=-1)
         self.panel = createLeftPanel(self)
         self.statusbar = self.CreateStatusBar()

class App(wx.App):
     def OnInit(self):
         wx.App.__init__(self)
         self.frame = Frame(-1)
         self.frame.Show()
         self.SetTopWindow(self.frame)
         return True

     def OnExit(self):
         pass

if __name__ == '__main__':
     app = App()
     app.MainLoop()



#################File project.py############################
import os

"""
The Project class handles reading/writing strings from/to file
"""

class Project(object):
     def __init__(self, filename):
         self.fname = filename

     def readProject(self):
         fp = open(self.fname, 'r')
         flist = []
         for line in fp:
             flist.append(line.strip())
         fp.close()
         return flist

     def writeProject(self, flist):
         fp = open(self.fname, 'w')
         for item in flist:
             fp.write('%s%s' % (item, os.linesep))
         fp.close()

     def appendLineToProject(self, aString):
         #Check if aString is not in file already
         fp = open(self.fname, 'r+')
         beforeList = self.readProject()
         fp.close()
         if aString not in beforeList:
             fp = open(self.fname, 'a')
             fp.write('%s%s' % (aString, os.linesep))
             fp.close()

     def removeLineFromProject(self, aString):
         #Remove all instances of aString
         fp = open(self.fname, 'r+')
         beforeList = self.readProject()
         afterList = []
         if aString in beforeList:
             for item in beforeList:
                 if aString.strip() != item.strip():
                     afterList.append(item)
                 else:
                     pass
         else:
             afterList = beforeList

         self.writeProject(afterList)
         fp.close()



More information about the Python-list mailing list