событие wxpython не запускается - PullRequest
0 голосов
/ 30 сентября 2011

Я следую примеру, приведенному в http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

У меня есть нить, которая проверяет сервер sftp на наличие новых файлов каждые 30 секунд.Если он находит файлы, он загружает их в базу данных, а затем должен инициировать обновление определенных элементов графического интерфейса, которые будут перезагружаться из базы данных.

Код пользовательского события:

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"))

Один из элементов графического интерфейса:

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 находится в основном фрейме, а не в элементе графического интерфейса - требуется ли это?

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

События не распространяются на его дочерние элементы, поэтому, если MyGrid является дочерним элементом вашего основного фрейма, события, опубликованные в главном кадре, не попадут в MyGrid.Вместо этого вы можете привязать обработчик событий непосредственно к вашей функции в экземпляре MyGrid следующим образом:

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

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

Я не слишком знаком с этим типом привязки, поскольку я обычно использую wx.Bind.

0 голосов
/ 30 сентября 2011

Я не уверен, но этот пример был основан на чем-то в вики: http://wiki.wxpython.org/LongRunningTasks

Я подозреваю, что поскольку в качестве аргумента он говорит "win", он, вероятно, ссылается на окно верхнего уровня, поэтому, вероятно, необходим wx.Frame. Вы все еще можете обновить сетку из фрейма.

РЕДАКТИРОВАТЬ: Мэнни имеет хорошую точку. Это, вероятно, будет работать тоже. И пабсаб скалы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...