Предположим, я хочу создать 500 wxWidget как (некоторые панели, цветные кнопки и текст ctrl и т.д.), я должен создать все это за один раз, но это заморозит мой основной поток, поэтому я помещаю эту часть создания в дочерний поток и показать некоторый gif anim в основной теме. Но я не смог получить все эти объекты wxWidget, созданные в моем кадре, в дочернем потоке.
Могу ли я получить этот wxWidgets (созданный в дочернем потоке) в основном потоке. просто рассмотрим случай, когда мне нужно создать дочерние элементы фрейма в дочернем потоке и анимации анимации основного потока. после того, как дочерняя нить закончит, все дочерние элементы, созданные в дочернем потоке, будут доступны в основном потоке.
Любая помощь действительно заметна.
Я использую python 2.5, wxpython 2.8 на windowsxp.
Вы можете использовать pubsub, который включен в wxpython - wx.lib.pubsub
.
См. мой ответ здесь для базового примера использования для межпоточных комм.
В качестве альтернативы: пример использования wx.Yield
для обновления вашего окна.
import wx
class GUI(wx.Frame):
def __init__(self, parent, title=""):
wx.Frame.__init__(self, parent=parent, title=title, size=(340,380))
self.SetMinSize((140,180))
self.creating_widgets = False
self.panel = wx.Panel(id=wx.ID_ANY, parent=self)
self.startButton = wx.Button(self.panel, wx.ID_ANY, 'Start')
self.stopButton = wx.Button(self.panel, wx.ID_ANY, 'Stop')
self.messageBox = wx.TextCtrl(self.panel, wx.ID_ANY, '', size=(75, 20))
self.Bind(wx.EVT_BUTTON, self.onStart, self.startButton)
self.Bind(wx.EVT_BUTTON, self.onStop, self.stopButton)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.startButton, 0, wx.ALL, 10)
self.sizer.Add(self.stopButton, 0, wx.ALL, 10)
self.sizer.Add(self.messageBox, 0, wx.ALL, 10)
self.panel.SetSizerAndFit(self.sizer)
def onStart(self, event):
self.creating_widgets = True
count = 0
self.startButton.Disable()
while self.creating_widgets:
count += 1
#Create your widgets here
#just for simulations sake...
wx.MilliSleep(100)
self.messageBox.SetLabel(str(count))
#Allow the window to update,
#You must call wx.yield() frequently to update your window
wx.Yield()
def onStop(self, message):
self.startButton.Enable()
self.creating_widgets = False
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = GUI(None)
frame.Show()
app.MainLoop()
Вы можете отправить их обратно в очередь, или все это происходит в одном экземпляре класса, назначьте виджеты в известное место в экземпляре для основного потока, чтобы забрать их. Сигнал через семафор.