2013-03-12 56 views
0

尊敬的社區成員:如何殺死以前運行的事件調用方法

以下是一個簡單的wx.app只有一個文本控件。當這個文本控件被編輯時,一個大的過程開始。如果緩慢地編輯控件,編輯感覺正常。但是,如果人類是一個快速的盲文,編輯就會失去作用。我認爲解決方案是殺掉以前的函數self.VeryLargeProcess()的調用。

你怎麼做到的? 有沒有更好的方法來做到這一點?

import wx 

class MyFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "My Frame") 
     main_panel = wx.Panel(self) 

     static_box = wx.StaticBox(main_panel, -1, "Text control") 
     static_box.SetFont(wx.Font(15, wx.ROMAN, wx.NORMAL, wx.NORMAL)) 
     main_sizer = wx.StaticBoxSizer(static_box, wx.VERTICAL) 

     text_ctrl = wx.TextCtrl(main_panel, wx.ID_ANY, "Edit me, a large process will start", wx.DefaultPosition, [200,100], wx.TE_MULTILINE) 
     main_sizer.Add(text_ctrl, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5) 

     main_panel.SetSizer(main_sizer) 
     main_sizer.SetSizeHints(self) 

     self.Bind(wx.EVT_TEXT, self.VeryLargeProcess, text_ctrl) 

    def VeryLargeProcess(self, event): 

     # kill previous self.VeryLargeProcess() 

     for i in range(0, 3000000): 
      a = i 

if __name__ == '__main__': 
    app = wx.App() 
    frame = MyFrame() 
    frame.Show() 
    app.MainLoop() 

回答

1

如果過程需要「較長時間」來運行,那麼你就需要把這個過程在一個單獨的線程或您的GUI的響應速度會放慢或停止。關於使用線程的各種方式,wxPython wiki有很好的article,我也寫了關於該主題的tutorial

+0

非常感謝,你的教程真的很棒。 – 2013-03-14 16:44:48

+0

再次感謝您爲我指出正確的方向。 添加到這些網頁上,我建議人們閱讀: http://wiki.wxpython.org/LongRunningTasks 太多,特別是瞭解使用的:在 類的WorkerThread(線程) self._want_abort – 2013-03-26 20:44:54

+0

我掛該頁面首先。這絕對是一個很好的資源! – 2013-03-26 20:55:19