【发布时间】:2015-09-04 15:42:13
【问题描述】:
简要说明我要达到的目标:
我正在开发一个使用 Python、wxPython 和 matplotlib 构建的分析软件。我正在尝试实现一个函数,程序可以在执行一些分析计算后绘制结果。目前,程序在执行计算时会冻结(计算时间最多需要 10 秒,具体取决于数据量),因此我正在尝试使用线程来创建非阻塞程序以改善用户体验。
我遇到的问题
我不断收到此错误: (PyAssertionError:C++ 断言“hdcDst && hdcSrc”在 AlphaBlt():AlphaBlt():invalid HDC 中失败...... \src\msw\dc.cpp(2559))
谷歌搜索并没有真正帮助确定原因。
我将在帖子底部发布完整的追溯。
这是我的代码:
import wx
import time
import matplotlib.pyplot as plt
from wx.lib.pubsub import Publisher as pub
from threading import Thread
def plotgraph(x,y,sleeptime):
plt.plot(x,y)
#Simulate long process using time.sleep
time.sleep(sleep time)
#Send out a message once process is completed
pub.sendMessage('PLOT','empty')
class listener():
def __init__(self,name):
self.name = name
#Listens to message
pub.subscribe(self.Plot,'PLOT')
pass
def Plot(self,message):
print self.name
plt.show()
print 'printed'
waiting = listener('Bob')
t1 = Thread(target=plotgraph,args=([1,2,3],[1,2,3],5))
t1.start()
t2 = Thread(target=plotgraph,args=([1,2,3],[1,2,3],3))
t2.start()
基本上,用户将单击 GUI 上的一个图标,这将触发一个函数来执行一些由此处的“plotgraph()”模拟的分析计算。目前,不使用线程, plotgraph() 将阻塞我的整个程序,所以我试图使用线程来执行计算以释放我的 GUI。
但是,当我尝试在线程中绘制我的 GUI 时,即在 plotgraph() 中有 plt.show(),绘图出现然后又消失了。当我再次单击 GUI 上的按钮以生成线程时,我得到了同样的错误。
所以我试图通过在线程结束后发送一条消息来解决它,以便 plt.show() 将在线程之外发生,但我仍然遇到同样的错误。
我似乎无法在网上找到类似的错误,除了 2008 年发布的一个帖子。如果有人可以提供帮助,那就太棒了!
简而言之 我需要一种方法来实现某种回调函数,该函数允许我在线程中执行分析计算,然后在计算完成后绘制图形以释放我的 GUI。如果有人可以向我解释这里出了什么问题,或者可以建议一种替代方法,那就太好了。非常感谢!!
这是完整的追溯:
File "C:\Users\chaishen\AppData\Local\Enthought\Canopy32\App\appdata\canopy-1.
.5.3123.win-x86\lib\threading.py", line 810, in __bootstrap_inner
self.run()
File "C:\Users\chaishen\AppData\Local\Enthought\Canopy32\App\appdata\canopy-1.
.5.3123.win-x86\lib\threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "<ipython-input-5-0cb01f87e97a>", line 13, in plotgraph
pub.sendMessage('PLOT','empty')
File "C:\Users\chaishen\AppData\Local\Enthought\Canopy32\User\lib\site-package
\wx\lib\pubsub.py", line 811, in sendMessage
self.__topicTree.sendMessage(aTopic, message, onTopicNeverCreated)
File "C:\Users\chaishen\AppData\Local\Enthought\Canopy32\User\lib\site-package
\wx\lib\pubsub.py", line 498, in sendMessage
deliveryCount += node.sendMessage(message)
File "C:\Users\chaishen\AppData\Local\Enthought\Canopy32\User\lib\site-package
\wx\lib\pubsub.py", line 336, in sendMessage
listener(message)
File "<ipython-input-5-0cb01f87e97a>", line 24, in Plot
plt.show()
File "C:\Users\chaishen\AppData\Local\Enthought\Canopy32\User\lib\site-package
\matplotlib\pyplot.py", line 155, in show
return _show(*args, **kw)
File "C:\Users\chaishen\AppData\Local\Enthought\Canopy32\User\lib\site-package
\matplotlib\backend_bases.py", line 154, in __call__
manager.show()
File "C:\Users\chaishen\AppData\Local\Enthought\Canopy32\User\lib\site-package
\matplotlib\backends\backend_wx.py", line 1414, in show
self.canvas.draw()
File "C:\Users\chaishen\AppData\Local\Enthought\Canopy32\User\lib\site-package
\matplotlib\backends\backend_wxagg.py", line 50, in draw
self.gui_repaint(drawDC=drawDC)
File "C:\Users\chaishen\AppData\Local\Enthought\Canopy32\User\lib\site-package
\matplotlib\backends\backend_wx.py", line 911, in gui_repaint
drawDC.DrawBitmap(self.bitmap, 0, 0)
File "C:\Users\chaishen\AppData\Local\Enthought\Canopy32\User\lib\site-package
\wx\_gdi.py", line 3460, in DrawBitmap
return _gdi_.DC_DrawBitmap(*args, **kwargs)
yAssertionError: C++ assertion "hdcDst && hdcSrc" failed at ..\..\src\msw\dc.cp
(2559) in AlphaBlt(): AlphaBlt(): invalid HDC
【问题讨论】:
-
我无法让 pubsub 工作,但我发现 wx.lib.delayedresult 更容易做类似的事情。 wxpython 演示有一个很好的例子,另一个例子在这里showmedo.com/videotutorials/…
-
@otterb 非常感谢!我试过使用 startWorker,但只要“线程”死亡,我的绘图窗口就会自动终止。 :(你知道有什么方法可以规避吗?
标签: python multithreading matplotlib wxpython