【发布时间】:2011-09-30 09:50:22
【问题描述】:
我正在遵循http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/中给出的示例
我有一个线程每 30 秒检查一次 sftp 服务器是否有新文件。如果它找到文件,它将它们上传到数据库,然后它应该触发某些 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 元素 - 这是必需的吗?
【问题讨论】: