Question related to wx and dynamically updating windows
Mike Driscoll
kyosohma at gmail.com
Mon Oct 20 10:14:52 EDT 2008
On Oct 20, 5:43 am, Andy <a... at start.no> wrote:
> 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()
I recommend re-posting to the wxPython User's List if you haven't
already:
http://wxpython.org/maillist.php
Also, please make a small runnable sample: http://wiki.wxpython.org/MakingSampleApps
That well help us (and you) figure out why it doesn't work
Mike
More information about the Python-list
mailing list