2011-11-20 82 views
0

我想用wxPython創建一個GUI定時器。單擊一個開始按鈕,計時器啓動並且一個標籤顯示計時器,計時秒數可以達到幾分鐘,也可以達到幾小時。停止按鈕停止定時器。我不知道如何讓計時器不斷顯示在標籤上。我嘗試了一段時間True循環,但似乎SetLabel()或Time()想要顯示一次,並且正在等待循環結束。wxPython StopWatch不斷顯示計數時間?

import wx 

class Timer(wx.Frame): 

    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(400, 350)) 

     self.main() 
     self.Centre() 
     self.Show() 

    def main(self): 

     panel = wx.Panel(self) 
     sizer = wx.GridBagSizer(5, 0) 

     self.timer = wx.StopWatch() 

     self.label = wx.StaticText(panel) 
     sizer.Add(self.label, pos=(0, 0), flag=wx.ALIGN_CENTER) 

     button_start = wx.Button(panel, label='Start') 
     self.Bind(wx.EVT_BUTTON, self.OnStart, button_start) 
     sizer.Add(button_start, pos=(1, 0), flag=wx.ALIGN_CENTER) 

     button_stop = wx.Button(panel, label='Stop') 
     self.Bind(wx.EVT_BUTTON, self.OnStop, button_stop) 
     sizer.Add(button_stop, pos=(2, 0), flag=wx.ALIGN_CENTER) 

     sizer.AddGrowableRow(0) 
     sizer.AddGrowableRow(1) 
     sizer.AddGrowableRow(2) 
     sizer.AddGrowableCol(0) 

     panel.SetSizer(sizer) 

    def OnStart(self, event): 

     self.timer.Start() 
     while True: 
      self.label.SetLabel(str(self.timer.Time())) 

    def OnStop(self, event): 

     self.timer.Pause() 

if __name__ == '__main__': 

    app = wx.App() 
    Timer(None, 'Timer') 
    app.MainLoop() 

回答

1

您永遠不會從OnStart返回,因此事件循環掛起,等待事件處理程序完成。所有事件處理程序都需要立即返回,以便可以處理其他事件。使用wx.Timer處理程序來更新秒錶標籤。

0

這聽起來像你想從00:00:00開始,算上了吧?你應該看看wxPython演示中的LEDNumberCtrl演示。第三個例子與你要找的東西非常相似。我認爲你可以用最少的擺弄工作。

+0

LEDNumberCtrl主要是我正在尋找,謝謝。我花了很長時間才弄清楚如何從零開始。剩下的唯一一件事就是弄清楚爲什麼小時從7開始(或24小時爲19)。我的LEDNumberCtrl更改(帶註釋的行):http://pastebin.com/R1FpFTsG – user1055898