Search code examples
pythonwxpythonwxtextctrl

wxPython: show number repeatedly


I'm a very beginner of Python Programming, and now I'm wondering why my widgets cannot show number repeatedly. That is, I'd like to let the text show numbers from 1 to 9, but in the while loop, it only shows 9.... Any suggestions?

Here is my code(Python version: 2.6):

#!/user/bin/python


import wx

class Frame(wx.Frame):
def __init__(self,parent,id):
    wx.Frame.__init__(self, parent, id,
                      'Show Number',
                      size = (200,150),
                      style=wx.MINIMIZE_BOX | wx.RESIZE_BORDER 
| wx.SYSTEM_MENU | wx.CAPTION |  wx.CLOSE_BOX)
    self.initUI()

def initUI(self):

    widgetPanel=wx.Panel(self, -1)
    widgetPanel.SetBackgroundColour('white')

    # Buttons for play the simulation
    playButton = wx.Button(widgetPanel, -1, "Play", pos=(10,10), size=(30,30))

    self.Bind(wx.EVT_BUTTON, self.play, playButton)
    playButton.SetDefault()

    # Time
    self.timeText = wx.TextCtrl(widgetPanel, -1, "", pos=(10, 50), 
                            size =(100,30), style=wx.TE_CENTER)
    self.timeText.SetBackgroundColour('white')
    self.timeText.SetFont(wx.Font(20, wx.DECORATIVE, wx.NORMAL, wx.NORMAL))

def play(self, event):
    #self.timeText.SetValue("19:32")
    self.show_num()

def show_num(self):
    x = 0
    while(x < 10):
        self.timeText.SetValue(str(x))
        x += 1

if __name__ == "__main__":
    app = wx.App(False)
    frame = Frame(parent=None,id=-1)
    frame.Show()
    app.MainLoop()

Solution

  • Like the other answer said, you need to give time to your app to update. I have made a few additions to your code to make it work:

    import wx
    import time
    import thread
    
    class Frame(wx.Frame):
        def __init__(self,parent,id):
            wx.Frame.__init__(self, parent, id,
                              'Show Number',
                              size = (200,150),
                              style=wx.MINIMIZE_BOX | wx.RESIZE_BORDER 
        | wx.SYSTEM_MENU | wx.CAPTION |  wx.CLOSE_BOX)
            self.initUI()
    
        def initUI(self):
    
            widgetPanel=wx.Panel(self, -1)
            widgetPanel.SetBackgroundColour('white')
    
            # Buttons for play the simulation
            playButton = wx.Button(widgetPanel, -1, "Play", pos=(10,10), size=(30,30))
    
            self.Bind(wx.EVT_BUTTON, self.play, playButton)
            playButton.SetDefault()
    
            # Time
            self.timeText = wx.TextCtrl(widgetPanel, -1, "", pos=(10, 50), 
                                    size =(100,30), style=wx.TE_CENTER)
            self.timeText.SetBackgroundColour('white')
            self.timeText.SetFont(wx.Font(20, wx.DECORATIVE, wx.NORMAL, wx.NORMAL))
    
        def play(self, event):
            #self.timeText.SetValue("19:32")
            #self.show_num()
            thread.start_new_thread(self.show_num,())
    
        def show_num(self):
            x = 0
            while(x < 10):
                self.timeText.SetValue(str(x))
                time.sleep(1)
                x += 1
    
    if __name__ == "__main__":
        app = wx.App(False)
        frame = Frame(parent=None,id=-1)
        frame.Show()
        app.MainLoop()
    

    Notice that time.sleep(1) pauses the while loop for 1 second so that the display can be updated. You can reduce or increase the pause time as you desire.