Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将在子线程中创建的对象返回到主线程中_Python_Wxpython - Fatal编程技术网

Python 将在子线程中创建的对象返回到主线程中

Python 将在子线程中创建的对象返回到主线程中,python,wxpython,Python,Wxpython,假设我想创建500个wxWidget(如一些面板、颜色按钮和文本ctrl等),我必须一次性创建所有这些,但这将冻结我的主线程,因此我将此创建部分放在子线程中,并在主线程中显示一些gif动画。但我无法在子线程中获得在我的框架上创建的所有wxWidget对象 我可以将wxWidgets(在子线程中创建)返回到主线程中吗。 简单地考虑一个情况,我必须在子线程中创建一个框架的子帧,主线程显示动画。一旦子线程完成,在子线程中创建的所有子线程都将在主线程中可用。 任何帮助都是值得感激的 我在windowsx

假设我想创建500个wxWidget(如一些面板、颜色按钮和文本ctrl等),我必须一次性创建所有这些,但这将冻结我的主线程,因此我将此创建部分放在子线程中,并在主线程中显示一些gif动画。但我无法在子线程中获得在我的框架上创建的所有wxWidget对象

我可以将wxWidgets(在子线程中创建)返回到主线程中吗。 <强>简单地考虑一个情况,我必须在子线程中创建一个框架的子帧,主线程显示动画。一旦子线程完成,在子线程中创建的所有子线程都将在主线程中可用。

任何帮助都是值得感激的


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

您可以通过队列将它们发送回,或者这一切都发生在类的一个实例中,将小部件分配到实例中的某个已知位置,以便主线程拾取它们。通过信号量发出信号。

您可以使用wxpython--
wx.lib.pubsub中包含的

有关线程间通信用法的基本示例,请参阅


另一种方法是:举例说明如何使用
wx.Yield
更新窗口


多描述一点确实可以帮助我,lotA工作实现会更好,但您需要展示一个代码和问题的工作(或非工作)示例。实际上,我只想在子线程中创建wxWidgets/wxObject并返回主线程,PUbsub只能用作消息侦听器发送器,我不知道如何在我的情况下使用pubsub。你在子线程中广播widget对象,并在主线程中为此设置一个侦听器pubsub可以发送任何你想要的
类型
。我不知道是否可以发送widget对象,如果可以,那会很混乱。你为什么不省去自己的麻烦,在主线程中创建小部件,并使用子线程显示进度对话框或其他什么。。。这将为您节省很多麻烦。事实上,我必须在一次创建多个小部件,如果我在主线程中创建小部件,那么它将冻结GUI。HMM我不知道它是如何工作的,我猜您很快就会发现,考虑使用WX.Fulk方法定期更新窗口,作为线程的替代。Iv'e在我的答案中添加了一个基本的例子@volting great help man,wx.Yeild()对我真的很有帮助。真的是罗克的
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()