2011-09-30 43 views
0

我按照http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/wxPython的事件沒有觸發

給出的例子我有被檢查每30秒新文件的SFTP服務器的線程。如果它找到文件,它將它們上傳到一個數據庫,然後它應該觸發某些GUI元素的更新,這些GUI元素將從數據庫中重新加載。

自定義事件代碼:

EVT_RESULT_ID = wx.NewId() 

def EVT_RESULT(win, func): 
    """Define Result Event.""" 
    win.Connect(-1, -1, EVT_RESULT_ID, func) 

class ResultEvent(wx.PyEvent): 
    """Simple event to carry arbitrary result data.""" 
    def __init__(self, data): 
     """Init Result Event.""" 
     wx.PyEvent.__init__(self) 
     self.SetEventType(EVT_RESULT_ID) 
     self.data = data 

的FTP螺紋:

class FTPThread(threading.Thread): 
def __init__(self,wxObject): 
    """Init Worker Thread Class.""" 
    threading.Thread.__init__(self) 
    self.wxObject = wxObject 
    self._stop = threading.Event() 
    self._stop.set() 
    self.start() # start the thread 

def run(self): 
    while True: 
     time.sleep(30) 
     if not self._stop.isSet(): 
      wx.CallAfter(self.parseFTP) 

def stop(self): 
    self._stop.set() 

def resume(self): 
    self._stop.clear() 

def parseFTP(self): 
    #connect to db 
    ... 

    #connect to sftp site 
    ... 
    files_found=False 

    #process each file and delete 
    for file in dirlist: 
     files_found=True 
     ...#process into db 
     sftp.remove(file) 
    sftp.close() 
    t.close() 

    #trigger update event if files found 
    if files_found==True: 
     wx.PostEvent(self.wxObject, ResultEvent("Files found")) 

其中一個GUI元素:

class MyGrid(wx.grid.Grid): 
def __init__(self, parent): 
    wx.grid.Grid.__init__(self, parent,-1,style=wx.EXPAND) 
    self.parent=parent 
    ... 
    self.update() 
    EVT_RESULT(self, self.updateFromEvent) 

def updateFromEvent(self,event): 
    self.update() 

def update(self): 
    ... 

以下調試,正在創建wx.PostEvent ,但不會在網格中觸發任何響應。

我可以找到示例和我的代碼之間的唯一區別是,在示例EVT_RESULT是在主框架,而不是一個GUI元素 - 這是必需的?

回答

1

事件不會傳播給它的子項,所以如果MyGrid是您的主框架的子項,那麼發佈在main中的事件將不會傳遞給MyGrid。你可以做的,而不是直接MyGrid的實例中綁定的事件處理程序的功能,像這樣:

"""from MainWindow""" 
self._workerthread = FtpThread(...) 
self._mygrid = MyGrid(...) 

# Bind event 
EVT_RESULT(self, self._mygrid.updateFromEvent) 

我不是太熟悉這樣的結合,因爲我通常使用wx.Bind。

+0

謝謝。最後我發現,使用libPubSub http://wiki.wxpython.org/WxLibPubSub比我使用Events更加「正確」,而且我已經以這種方式工作。 – meepmeep

0

我不知道,但例如是基於維基的東西:http://wiki.wxpython.org/LongRunningTasks

我懷疑,因爲它說:「贏」作爲一個參數,它所指的可能是一個頂層窗口,所以wx.Frame可能是必需的。你仍然可以從框架中更新網格。

編輯:曼尼有一個好點。這可能也會起作用。和pubsub岩石!