我按照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元素 - 這是必需的?
謝謝。最後我發現,使用libPubSub http://wiki.wxpython.org/WxLibPubSub比我使用Events更加「正確」,而且我已經以這種方式工作。 – meepmeep