Потоки, wxpython и статусбар - PullRequest
       24

Потоки, wxpython и статусбар

4 голосов
/ 14 января 2011

Я делаю программу, в которой я использую wxStatusBar, когда начинается загрузка, я запускаю дочерний поток, как это:

def OnDownload(self, event):
    child = threading.Thread(target=self.Download)
    child.setDaemon(True)
    child.start()

Загрузка - это еще одна функция без параметров (кроме self). Я хотел бы обновить свою строку состояния с некоторой информацией о ходе загрузки, но когда я пытаюсь это сделать, я часто получаю ошибки Xwindow, glib и segfaults. Любая идея, чтобы решить это?

Решено: Мне просто нужно было включить wx.MutexGuiEnter (), прежде чем что-то менять в графическом интерфейсе внутри потока, и wx.MutexGuiLeave (), когда закончите. Например

def Download(self):
    #stuff that doesn't affect the GUI
    wx.MutexGuiEnter()
    self.SetStatusText("This is a thread")
    wx.MutexGuiLeave()

И это все: D

Ответы [ 2 ]

1 голос
/ 14 января 2011

Большинство людей обращаются к вики wxPython:

http://wiki.wxpython.org/LongRunningTasks

Я также написал небольшую статью на эту тему здесь:

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

Я не думаю, что когда-либо видел ваше решение раньше.

0 голосов
/ 14 января 2011

Как вы обновляете строку состояния?

Я думаю, что у вас все будет хорошо, если вы создадите пользовательское событие, а затем отправите его через wx.PostEvent, чтобы уведомить о фрейме / строке состояния в потоке графического интерфейса.

Для прогресса загрузки в строке состояния вы можете захотеть, чтобы ваше событие выглядело примерно так:

DownloadProgressEvent, EVT_DL_PROGRESS = wx.lib.newevent.NewEvent()

# from the thread...

event = DownloadProgressEvent(current=100, total=1000, filename="foo.jpg")
wx.PostEvent(frame, event)

# from the frame:

def OnDownloadProgress(self, event):
    self.statusbar.update_dl_msg(event.current, event.total, event.filename)

Вот еще некоторые подробности из вики wxPython.

...