如何在进度条上设置wxPython线程
我正在尝试线程wx.ProgressDialog。我上了一门线程课程如何在进度条上设置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",
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()