如何在进度条上设置wxPython线程

如何在进度条上设置wxPython线程,python,multithreading,wxpython,Python,Multithreading,Wxpython,我正在尝试线程wx.ProgressDialog。我上了一门线程课程 class Progress(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): max = 1000000 dlg = wx.ProgressDialog("Progress dialog example",

我正在尝试线程wx.ProgressDialog。我上了一门线程课程

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()
当我运行thread1.start()时,我会收到100条类型为
2012-12-01 00:31:19.215 Python[3235:8807]***\u NSAutoreleaseNoPool()的警告:NSConcreteAttributedString类的对象0x11a88f300在没有池的情况下自动删除-只是泄漏
并且进度条不会显示


如何使用wxPython线程制作进度条?

它似乎在抱怨参数4不是wxWindow(因此,
参数4的类型为“wxWindow*”
是错误的一部分)

查看您的调用,参数4正在传递
parent=self
。那么,什么是
self
?换句话说,包含此代码的方法属于哪个类?它是一个
wx.Window
或其子类,还是像一个
应用程序或一个
进度
不是

(实际上,假设您将<代码>父< /代码>作为关键字参数,这恰好是恰好发生在您调用 Wx.PrrassCudio构造函数的第四个位置,并且在第四个位置,调用底层C++函数,这就是实际抱怨的内容。如果您切换了
maximum
parent
,我想它仍然会说
参数4
,而不是
参数3

要验证这一点,请尝试在失败的调用中取出
parent=self
,它应该可以工作,或者将
parent=object()
添加到只有
None
可以工作的调用中,它应该会失败

当然,这实际上并不能解决问题。但要做到这一点,你必须弄清楚你想要的
父项是什么,然后传递它,而不是
自我


另外,我认为问题与线程无关。

它似乎在抱怨参数4不是wxWindow(因此,
参数4的类型为“wxWindow*”
是错误的一部分)

查看您的调用,参数4正在传递
parent=self
。那么,什么是
self
?换句话说,包含此代码的方法属于哪个类?它是
wx.Window
或其子类,还是类似于
应用程序
进度

(实际上,假设您将<代码>父< /代码>作为关键字参数,这恰好是恰好发生在您调用 Wx.PrrassCudio构造函数的第四个位置,并且在第四个位置,调用底层C++函数,这就是实际抱怨的内容。如果您切换了
maximum
parent
,我想它仍然会说
参数4
,而不是
参数3

要验证这一点,请尝试在失败的调用中取出
parent=self
,它应该可以工作,或者将
parent=object()
添加到只有
None
可以工作的调用中,它应该会失败

当然,这实际上并不能解决问题。但要做到这一点,你必须弄清楚你想要的
父项是什么,然后传递它,而不是
自我


另外,我认为这个问题与线程无关。

所有wxPython小部件和操作都应该在一个线程中。如果你想让一个对话框由另一个线程控制,那么你必须使用计时器和队列从另一个线程发送对话框消息

我理解的另一种方法应该是(我没有测试过)在另一个线程中创建一个完全独立的wxApp,只是为了你的对话。你仍然需要以某种方式与主线程通信

编辑: 这里是指向更多信息的链接。它在底部有一些关于使用wx.CallAfter更新工作线程进度的信息。它还显示了如何在单独的线程中运行单个函数而不创建单独的类


所有wxPython小部件和操作都应该在一个线程中。如果您想让另一个线程控制对话框,则必须使用计时器和队列从另一个线程发送对话框消息

我理解的另一种方法应该是(我没有测试过)在另一个线程中创建一个完全独立的wxApp,只是为了你的对话。你仍然需要以某种方式与主线程通信

编辑: 这里是指向更多信息的链接。它在底部有一些关于使用wx.CallAfter更新工作线程进度的信息。它还显示了如何在单独的线程中运行单个函数而不创建单独的类


为什么有一个名为
ProgressDialog
的类,它包装了一个
ProgressDialog
?这几乎肯定会给人类读者造成混乱,即使
wx.
部分意味着解释器不会被弄糊涂。另外,既然它完成了所有的工作,包括睡眠和破坏数据库,为什么这个类是一个类呢对话框,就在
\uuu init\uuuu
调用中?而且,
Thread1
根本不创建
ProgressDialog
;它创建了一个
ProgressFrame
。您在这里调试的类对吗?哦,您是对的,它应该是ProgressFrame。不过这给了我一个不同的错误。我在
def ru中有这个对话框n
的进度,但后来我得到了这个错误:2012-12-01 00:28:30.237 Python[3203:a407]***\u nsautoreleasenool():NSConcreteAttributedString类的对象0x10324b6b0在没有池的情况下自动删除-只是泄漏我假设您在系统日志或控制台输出中看到了这一点。如果是这样,那不是错误,只是警告。这可能是wx的OS X实现中的一个错误,但许多框架都有轻微缺陷
class MiPPanel ( wx.Panel ):
    [...]
    def runmiP(self, event):
        thread1 = Progress() 
        thread1.start()