Безопасен ли поток wx.StaticText? - PullRequest
2 голосов
/ 29 ноября 2011

Например, я использую объект wx.StaticText в качестве счетчика, это потокобезопасно?Например:

class TaskFrame(wx.Frame):
    def __init__(self):
        self.Counter = wx.StaticText(MainPanel, id = -1, label = "0")

Что бы произошло, если бы я GetLabel и SetLabel для self.Counter в разных потоках одновременно?Могу ли я получить какие-либо проблемы?

Result = self.Counter.GetLabel()
self.Counter.SetLabel(WhateverResult)

1 Ответ

2 голосов
/ 29 ноября 2011

Это не потокобезопасно. Процитирую это превосходное сообщение в блоге :

В мире wxPython существует три связанных «безопасных» метода. Если вы не используете один из этих трех вариантов при обновлении интерфейса пользователя, у вас могут возникнуть странные проблемы. Иногда ваш графический интерфейс будет работать просто отлично. В других случаях произойдет сбой Python без видимой причины. Таким образом, нужны безопасные для потоков методы: wx.PostEvent, wx.CallAfter и wx.CallLater.

В двух словах, вы создаете приемник для объекта публикации:

from wx.lib.pubsub import Publisher
Publisher().subscribe(update_function, 'update') # Params: callback, event name

Затем из потока используйте CallAfter:

# Will trigger 'update_function' with argument 'My message'
wx.CallAfter(Publisher().sendMessage, 'update', 'My message')

Независимо от всего этого, хотя, если вы просто хотите обмениваться переменными между процессами, используйте поддерживаемый способ сделать это . В настоящее время вы используете GUI-инструментарий для хранения ваших переменных, в то время как вы должны использовать встроенные типы для этого. Поделитесь ими правильно и используйте GUI для отображения ваших данных.

...