2010-08-26 69 views
1

假設我想創建500個像wxWidget(一些面板,顏色按鈕和文本Ctrl等),我必須在一次創建所有這些,但這會凍結我的主線程,所以我把這個創建部分放在子線程中,並在主線程中顯示一些gif anim。但我無法得到所有這些wxWidget對象,這些對象是在子線程中在我的框架上創建的。獲取在子線程中創建的對象在主線程中返回

我可以在主線程中獲得wxWidgets(在子線程中創建)。 只需考慮一個案例,我必須在子線程和主線程顯示動畫中創建一個框架的子項。一旦子線程完成在子線程中創建的所有子線程應在主線程中可用。

任何幫助真的很明顯。

我在windowsxp上使用python 2.5,wxpython 2.8。

+0

我不知道是否有可能發送小部件對象,如果是這樣,它會是混亂的。你爲什麼不保存自己的麻煩,並在主線程中創建小部件,並使用子線程顯示進度對話框或其他內容...這將爲您節省很多麻煩。 – volting 2010-08-26 14:44:06

+0

其實我必須在一次創建這麼多的小部件,如果我去創建主線程中的小部件,那麼它會凍結GUI。 – 2010-08-26 16:20:20

+0

嗯,我不明白它會如何工作,我想你會很快發現,考慮使用wx.Yield方法定期更新窗口,作爲線程的替代方案.. Iv'e增加了一個基本示例我的回答 – volting 2010-08-26 17:17:32

回答

2

您可以使用wxpython附帶的pubsub - wx.lib.pubsub。請參閱my answer here以獲取線程間通信使用的基本示例。


對於可選:你如何使用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() 
+0

其實我只是想創建wxWidgets/wxObject到子線程中並返回主線程,PUbsub只能用作消息監聽器發件人,我無法得到如何在我的情況下使用pubsub。 – 2010-08-26 13:41:01

+0

您在子線程中廣播窗口小部件對象,並在主線程中爲此設置一個偵聽器。 – volting 2010-08-26 13:47:09

+0

pubsub可以發送任何您想要的「類型」。 – volting 2010-08-26 13:47:47

0

您可以將它們發送回隊列,或者全部發生在類的一個實例中,將小部件分配給實例中的某個已知位置,供主線程將其接收。通過信號燈發出信號。

+0

多一點說明可以真正幫助我很多 – 2010-08-26 12:34:14

+0

工作實現會更好,但是您需要展示一個工作(或非工作)的代碼和問題示例。 – 2017-04-28 13:36:31