2012-02-02 8 views
1

當我啓動程序時,它運行良好。但是當我按倒數按鈕,然後嘗試激活動作按鈕時,它會凍結。我的wxPython小部件在激活另一個函數後凍結了我的程序

import wx 
import time 


class LeftPanel(wx.Panel): 
    def __init__(self, parent, id): 
     wx.Panel.__init__(self, parent, id, style=wx.BORDER_SUNKEN) 
     self.text = parent.GetParent().rightPanel.text 
     self.text_2 = parent.GetParent().rightPanel.text_2 
     button1 = wx.Button(self, -1, 'Count', (10, 10)) 
     button2 = wx.Button(self, -1, 'Countdown', (10, 60)) 
     button3 = wx.Button(self, -1, 'Action', (10, 110)) 
     self.Bind(wx.EVT_BUTTON, self.OnPlus, id=button1.GetId()) 
     self.Bind(wx.EVT_BUTTON, self.OnMinus, id=button2.GetId()) 
     self.Bind(wx.EVT_BUTTON, self.button_Pressed, id=button3.GetId()) 
     self.timed_Out = 1  


    def OnPlus(self, event): 
     value = 1 
     for t in range(5000): 
      value = value + 1 
      time.sleep(1) 
      self.text.SetLabel(str(value)) 

    def OnMinus(self, event): 
     import math 
     value = 60 
     for t in range(value): 
      value = value - 1 
      time.sleep(1) 
      self.text.SetLabel(str(value/60) + ':' + str(value%60)) 

     self.timed_Out = 0 
     self.text_2.SetLabel(str('End o\'line.')) 

    def button_Pressed(self, event): 
     if self.timed_Out == 1: 
      if self.text_2 == 'First': 
       self.text_2.SetLabel('Second') 

      elif self.text_2 == 'Second': 
       self.text_2.SetLabel('First') 



class RightPanel(wx.Panel): 
    def __init__(self, parent, id): 
     wx.Panel.__init__(self, parent, id, style=wx.BORDER_SUNKEN) 
     self.text = wx.StaticText(self, -1, '0', (10,60)) 
     self.text_2 = wx.StaticText(self,-1,'First',(10, 120)) 

class Communicate(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, size=(600, 200)) 
     panel = wx.Panel(self, -1) 
     self.rightPanel = RightPanel(panel, -1) 
     leftPanel = LeftPanel(panel, -1) 
     hbox = wx.BoxSizer() 
     hbox.Add(leftPanel, 1, wx.EXPAND | wx.ALL, 4) 
     hbox.Add(self.rightPanel, 1, wx.EXPAND | wx.ALL, 5) 
     panel.SetSizer(hbox) 
     self.Centre() 
     self.Show(True) 



app = wx.App() 
Communicate(None, -1, 'widgets communicate') 
app.MainLoop() 
+0

同樣的問題:http://stackoverflow.com/questions/8995602/wxpython-app-no-error-but-still-freezes – jdi 2012-02-02 02:48:54

回答

1

這是因爲您正在按鈕事件處理函數中調用time.sleep調用。這將導致用戶界面凍結。隨着計數器標籤更新(它不適合我),它可能會在視覺上更新,但在事件處理程序完成之前,沒有界面元素可以工作。

你需要做的是在一個單獨的線程中運行計時器;然後,每秒發送一個事件給主窗口,告訴它更新其計數器。你可以用wx.PostEvent函數來做到這一點。

或者,爲了更簡單和更好的解決方案,您可以使用爲此目的而構建的wx.TimerHere is a tutorial about it。您也可以將它用於重複事件,這就是倒計時的情況。

有一個more generic tutorial about having long-running tasks activated by UI events;我將這個鏈接放在這裏,因爲我猜測Google上的用戶在搜索他們的應用程序凍結的原因時會查找這個鏈接,這可能不是因爲計時器。

+0

非常有幫助... TY! :) – JoryRFerrell 2012-02-02 15:21:57

+0

呃...你能幫我弄清楚爲什麼我的第二個標籤不更新之前,我甚至開始time.sleep()循環? – JoryRFerrell 2012-02-04 21:42:34

+0

##嗯...你能幫我弄清楚爲什麼我的第二個標籤沒有更新之前,我甚至開始time.sleep()循環? ##沒關係......這已經解決了。我需要使用.GetLabelText()以將當前str的標籤與另一個進行比較。 – JoryRFerrell 2012-02-15 20:27:35

相關問題