我正在尝试线程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创建进度条?
答案 0 :(得分:1)
所有wxPython小部件和操作都应该在一个线程中。如果您想要一个由另一个线程控制的对话框,那么您将不得不使用定时器和队列从另一个线程向该对话框发送消息。
我理解的另一种方式应该工作(我还没有测试过)它在另一个线程中为你的对话创建一个完全独立的wxApp。您将不得不以某种方式回复主线程。
修改强> 这是一个更多信息的链接。它底部有一些关于使用wx.CallAfter更新工作线程进度的信息。它还展示了如何在单独的线程中运行单个函数,而无需创建单独的类。
答案 1 :(得分:0)
看起来它抱怨争论4不是wxWindow(因此错误的argument 4 of type 'wxWindow *'
部分)。
查看您的电话,参数4正在传递parent=self
。那么,self
是什么?换句话说,使用此代码的方法是什么类?它是wx.Window
或其中一个子类的东西,还是像Application
或Progress
那样的东西?
(实际上,假设您将parent
作为关键字参数传递,那么它恰好位于您对wx.ProgressDialog
构造函数的调用中的第4位并且也位于调用底层C ++函数的第四个位置,这实际上是抱怨的。如果你切换maximum
和parent
,你会得到同样的错误,我认为它仍会说{{1而不是argument 4
。)
要验证这一点,请尝试在失败的调用中取出argument 3
,然后它应该可以正常运行,或者将parent=self
添加到只有parent=object()
的呼叫中,并且它应该有效失败。
当然,实际上并没有修复问题。但要做到这一点,你必须弄清楚你想要的是什么None
并传递而不是parent
。
PS,我认为问题根本与你的线程无关。