1

我正在尝试线程 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()

当我按下按钮时会调用它

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 的线程来制作进度条?

4

2 回答 2

1

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

我理解的另一种方式应该可以工作(我没有测试过),它可以在另一个线程中为您的对话框创建一个完全独立的 wxApp。您仍然必须以某种方式与主线程进行通信。

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

wxPython线程

于 2012-12-04T03:41:47.920 回答
0

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

查看您的电话,参数 4 正在传递parent=self。那么,什么是self?换句话说,带有此代码的方法属于哪个类?它是wx.Windowone 的子类或子类,还是不是类似于 anApplication或 a 的东西Progress

(实际上,鉴于您将parent作为关键字参数传递,巧合的是,它恰好在您对wx.ProgressDialog构造函数的调用中位于第 4 位,并且在对底层 C++ 函数的调用中位于第4 位,这只是巧合实际上是在抱怨。如果你切换maximumand parent,你会得到同样的错误,我认为它仍然会说argument 4而不是argument 3。)

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

当然,这并不能真正解决问题。但要做到这一点,你必须弄清楚你想要的parent是什么,并通过它而不是self.

PS,我不认为这个问题与你的线程有任何关系。

于 2012-11-30T23:19:06.987 回答