我的程序有主要的GUI线程来处理用户界面。
另一个线程开始处理艰苦的工作(循环,计算等)而不冻结主GUI。
来自我的"计算线程"我正在使用另一个模块draw_plots
,它只能绘制和保存多种图形。
import draw_plots as plots
class calculatorThread(QtCore.QThread):
signal1 = QtCore.pyqtSignal(int, int)
signal2 = QtCore.pyqtSignal(int,int)
signal3 = QtCore.pyqtSignal(int)
def __init__(self,input_file_txt, parameter_file_txt):
QtCore.QThread.__init__(self)
#and etc etc
在这个帖子的某个时刻我打电话:
plots.stacked_barplot(*arguments)
一切正常,但是,我在屏幕上多次收到消息:
QPixmap: It is not safe to use pixmaps outside the GUI thread
想知道我做错了什么,以及如何避免这条消息。
答案 0 :(得分:1)
好吧,你从计算器线程发出plot命令,然后使用QPixmap绘制绘图 - 所有这些都来自你的计算器线程。
理想情况下,您不应该使用计算器线程,而是发出一个你已经准备好进行绘图的信号 - 并在主线程中进行绘图。也许沿着以下几点:
class calculatorThread(QtCore.QThread):
plot_emit = QtCore.pyqtSignal()
def run(self):
self.plot_args = your_calculation()
self.plot_ready.emit()
外部,将plot_ready
信号连接到您的绘图命令:
calculator.plot_emit.connect(lambda x:
plots.stacked_barplot(*calculator.plot_args))
答案 1 :(得分:1)
如果在单独的线程中完成计算,则应使用QImage
。您还可以安全地访问QImage.bits()
并直接处理像素数据(更快)。
由于警告明确说明,QPixmap
对象只能在GUI线程中使用。如果您确实需要QImage
,则可以将计算出的QPixmap
转换为QPixmap
(但您可以直接在QImage
上绘制QPainter
)。