Update/Refresh Dynamically–Created WxPython Widgets
dynamic, python, refresh, wxpython
Solution
I have similar test code which I have written some time ago. Maybe you will find it useful.
import wx
#===================================================================================================
class UpperPanel(wx.Panel):
def __init__(self, *args, **kwargs):
wx.Panel.__init__(self, *args, **kwargs)
self.combo = wx.ComboBox(self, choices=["0", "1", "2", "3", "4"], size=(200, -1))
self.combo.Bind(wx.EVT_COMBOBOX, self.GetParent().middlePanel.Change)
self.logo = wx.Button(self, size=(300, 100))
self.sizer = wx.BoxSizer()
self.sizer.Add(self.combo, 0, wx.EXPAND)
self.sizer.Add(self.logo, 0, wx.EXPAND)
self.SetSizerAndFit(self.sizer)
#===================================================================================================
class MiddlePanel(wx.Panel):
def __init__(self, *args, **kwargs):
wx.Panel.__init__(self, *args, **kwargs)
self.subs = []
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizerAndFit(self.sizer)
def Change(self, e):
self.sizer = wx.BoxSizer(wx.VERTICAL)
for a in self.subs:
a.Destroy()
self.subs = []
for a in range(int(e.GetString())):
b = wx.Button(self, size=(-1, 50))
self.subs.append(b)
self.sizer.Add(b, 1, wx.EXPAND)
self.SetSizerAndFit(self.sizer)
self.GetParent().Fit()
#===================================================================================================
class MainWin(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None)
self.middlePanel = MiddlePanel(self)
self.upperPanel = UpperPanel(self)
self.textArea = wx.TextCtrl(self, size=(-1, 300), style=wx.TE_MULTILINE)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.upperPanel, 0, wx.EXPAND)
self.sizer.Add(self.middlePanel, 0, wx.EXPAND)
self.sizer.Add(self.textArea, 1, wx.EXPAND)
self.SetSizerAndFit(self.sizer)
#===================================================================================================
if __name__ == '__main__':
app = wx.PySimpleApp()
main_win = MainWin()
main_win.Show()
app.MainLoop()
Problem
New python programmer here and trying to learn how to dynamically update widgets. To start, I have the following code. What I would like to do is change my variable "self.dynamiclength" to any integer, and have WxPython update the number of widgets appropriately. I have tried putting self.Refresh() and self.Update() in my TestFrame after updating self.dynamiclength to no avail. I have done as much reading as possible on this before resorting to asking for help, but I am just too new at Wx to solve this one on my own. Thank you much! ``` import wx import wx.lib.scrolledpanel as scrolled class TestFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, size=(1000, 550)) panel = wx.Panel(self) mainSizer = wx.BoxSizer(wx.VERTICAL) pbox0 = wx.BoxSizer(wx.VERTICAL) controlback0 = wx.Button(panel, label="Back0") controlforward0 = wx.Button(panel, label="Forward0") pbox0.Add(controlback0, 0, wx.ALL) pbox0.Add(controlforward0, 0, wx.ALL) mainSizer.Add(pbox0) self.scrolling_window = scrolled.ScrolledPanel( panel ) self.scrolling_window.SetAutoLayout(1) self.scrolling_window.SetupScrolling() self.sizer = wx.BoxSizer( wx.VERTICAL ) self.child_windows = [] ############################################## #this is the variable that I want to change, #and I don't know how to get the 'for loop' #below to update as well. self.eedictionary = {} self.dynamiclength = 5 for i in range(0,self.dynamiclength): wind = self.addBox(i) self.sizer.Add(wind, 0, wx.CENTER|wx.ALL, 5) ############################################### #the following code binds all appropriate buttons to a pedigree variable updater button_binding_list = ['controlback','controlforward'] for j in button_binding_list: eid = self.eedictionary[str(i)+j] self.scrolling_window.Bind(wx.EVT_BUTTON, lambda evt: self.onclick(evt, id), id=eid) self.scrolling_window.SetSizer(self.sizer) mainSizer.Add(self.scrolling_window, 1, wx.EXPAND) panel.SetSizer(mainSizer) def addBox(self, i): pbox = wx.BoxSizer(wx.VERTICAL) controlback = wx.Button(self.scrolling_window, label="Back") controlforward = wx.Button(self.scrolling_window, label="Forward") pbox.AddMany([(controlback, 0, wx.ALL), (controlforward, 0, wx.ALL)]) #for each object created in the addBox module, its id is added to the dictionary self.eedictionary[str(i)+'controlback'] = controlback.GetId() self.eedictionary[str(i)+'controlforward'] = controlforward.GetId() return pbox def onclick(self, event): self.dynamiclength +=1 print 'added one to self.dynamiclength', self.dynamiclength if __name__=='__main__': app = wx.App(False) f = TestFrame() f.Show() app.MainLoop() ```