【问题标题】:wxpython event not triggeringwxpython 事件未触发
【发布时间】: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 元素 - 这是必需的吗?

【问题讨论】:

    标签: python events wxpython


    【解决方案1】:

    事件不会传播到其子框架,因此如果 MyGrid 是主框架的子框架,则发布在主框架中的事件不会传递到 MyGrid。您可以做的是将事件处理程序直接绑定到 MyGrid 实例中的函数,如下所示:

    """from MainWindow"""
    self._workerthread = FtpThread(...)
    self._mygrid = MyGrid(...)
    
    # Bind event
    EVT_RESULT(self, self._mygrid.updateFromEvent)
    

    我对这种绑定不太熟悉,因为我通常使用 wx.Bind。

    【讨论】:

    • 谢谢。最后,我发现使用 libPubSub wiki.wxpython.org/WxLibPubSub 对于我正在尝试做的事情比使用事件更“正确”,而且我已经让它以这种方式工作。
    【解决方案2】:

    我不确定,但该示例基于 wiki 中的某些内容:http://wiki.wxpython.org/LongRunningTasks

    我怀疑既然它说“win”作为参数,它可能指的是顶级窗口,所以 wx.Frame 可能是必需的。不过,您仍然可以从框架更新网格。

    编辑:曼尼有一个很好的观点。那可能也行。还有 pubsub 摇滚!

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2014-05-23
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      相关资源
      最近更新 更多