如何线程wxPython进度条

时间:2012-11-30 23:14:11

标签: python multithreading wxpython

我正在尝试线程wx.ProgressDialog。我有一个Progress threading类

class Progress(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        max = 1000000

        dlg = wx.ProgressDialog("Progress dialog example",
                               "An informative message",
                               maximum = max,
                               parent=None,
                               style = wx.PD_CAN_ABORT
                                | wx.PD_APP_MODAL
                                | wx.PD_ELAPSED_TIME
                                | wx.PD_ESTIMATED_TIME
                                | wx.PD_REMAINING_TIME
                                )
        keepGoing = True
        count = 0

        while keepGoing and count < max:
            count += 1
            wx.MilliSleep(250)

            if count >= max / 2:
                (keepGoing, skip) = dlg.Update(count, "Half-time!")
            else:
                (keepGoing, skip) = dlg.Update(count)
        dlg.Destroy()
当我按下

按钮时会调用

class MiPPanel ( wx.Panel ):
    [...]
    def runmiP(self, event):
        thread1 = Progress() 
        thread1.start() 

当我运行thread1.start()时,我收到100个类型2012-12-01 00:31:19.215 Python[3235:8807] *** __NSAutoreleaseNoPool(): Object 0x11a88f300 of class NSConcreteAttributedString autoreleased with no pool in place - just leaking 的警告,并且进度条没有显示。

如何使用线程与wxPython创建进度条?

2 个答案:

答案 0 :(得分:1)

所有wxPython小部件和操作都应该在一个线程中。如果您想要一个由另一个线程控制的对话框,那么您将不得不使用定时器和队列从另一个线程向该对话框发送消息。

我理解的另一种方式应该工作(我还没有测试过)它在另一个线程中为你的对话创建一个完全独立的wxApp。您将不得不以某种方式回复主线程。

修改 这是一个更多信息的链接。它底部有一些关于使用wx.CallAfter更新工作线程进度的信息。它还展示了如何在单独的线程中运行单个函数,而无需创建单独的类。

wxPython Threading

答案 1 :(得分:0)

看起来它抱怨争论4不是wxWindow(因此错误的argument 4 of type 'wxWindow *'部分)。

查看您的电话,参数4正在传递parent=self。那么,self是什么?换句话说,使用此代码的方法是什么类?它是wx.Window或其中一个子类的东西,还是像ApplicationProgress那样的东西?

(实际上,假设您将parent作为关键字参数传递,那么它恰好位于您对wx.ProgressDialog构造函数的调用中的第4位并且也位于调用底层C ++函数的第四个位置,这实际上是抱怨的。如果你切换maximumparent,你会得到同样的错误,我认为它仍会说{{1而不是argument 4。)

要验证这一点,请尝试在失败的调用中取出argument 3,然后它应该可以正常运行,或者将parent=self添加到只有parent=object()的呼叫中,并且它应该有效失败。

当然,实际上并没有修复问题。但要做到这一点,你必须弄清楚你想要的是什么None并传递而不是parent

PS,我认为问题根本与你的线程无关。