gpt4 book ai didi

python - Matplotlib/PyQT4 : transparent figure

转载 作者:行者123 更新时间:2023-11-28 18:46:46 26 4
gpt4 key购买 nike

我正在使用 Python 和 PyQt4,我想在 GUI 中嵌入一个 matplotlib 图。对我来说重要的是 Figure 的背景与 GUI 的背景颜色相匹配。 (实际情节周围没有灰色背景)

我的部分解决方案是使用以下代码使 Figure 透明:

...
fig.patch.set_alpha(0.5)
...

这在 pylab 模式下绘图时工作正常,但在 PyQt4 中嵌入时,重新渲染不会清除旧图形,而是将其添加到顶部并具有我提供的透明度。如下例所示,这是调整窗口大小的结果:

no working sample

样本是使用 code from the matplotlib website 生成的在 MyMplCanvas__init__ 语句中添加 set_alpha(0.5) 行。

最佳答案

您在 matplotlib 中发现了一个有趣的错误。 Qt4 后端在重绘之前不会清除它用来显示图形的 qImage,因此您会看到阴影。这很容易通过向 matplotlib.backends.backed_qt4Agg.FigureCanvasQTAgg.paintEvent

添加几行来解决
def paintEvent(self, e):
"""
Copy the image from the Agg canvas to the qt.drawable.
In Qt, all drawing should be done inside of here when a widget is
shown onscreen.
"""

#FigureCanvasQT.paintEvent(self, e)
if DEBUG:
print('FigureCanvasQtAgg.paintEvent: ', self,
self.get_width_height())

if self.blitbox is None:
# matplotlib is in rgba byte order. QImage wants to put the bytes
# into argb format and is in a 4 byte unsigned int. Little endian
# system is LSB first and expects the bytes in reverse order
# (bgra).
if QtCore.QSysInfo.ByteOrder == QtCore.QSysInfo.LittleEndian:
stringBuffer = self.renderer._renderer.tostring_bgra()
else:
stringBuffer = self.renderer._renderer.tostring_argb()

refcnt = sys.getrefcount(stringBuffer)

qImage = QtGui.QImage(stringBuffer, self.renderer.width,
self.renderer.height,
QtGui.QImage.Format_ARGB32)
rect = qImage.rect() ### <-- added this line
p = QtGui.QPainter(self)
p.eraseRect(rect) ### <-- added this line
p.drawPixmap(QtCore.QPoint(0, 0), QtGui.QPixmap.fromImage(qImage))

# draw the zoom rectangle to the QPainter
if self.drawRect:
p.setPen(QtGui.QPen(QtCore.Qt.black, 1, QtCore.Qt.DotLine))
p.drawRect(self.rect[0], self.rect[1],
self.rect[2], self.rect[3])
p.end()

# This works around a bug in PySide 1.1.2 on Python 3.x,
# where the reference count of stringBuffer is incremented
# but never decremented by QImage.
# TODO: revert PR #1323 once the issue is fixed in PySide.
del qImage
if refcnt != sys.getrefcount(stringBuffer):
_decref(stringBuffer)
else:
bbox = self.blitbox
l, b, r, t = bbox.extents
w = int(r) - int(l)
h = int(t) - int(b)
t = int(b) + h
reg = self.copy_from_bbox(bbox)
stringBuffer = reg.to_string_argb()
qImage = QtGui.QImage(stringBuffer, w, h,
QtGui.QImage.Format_ARGB32)
pixmap = QtGui.QPixmap.fromImage(qImage)
p = QtGui.QPainter(self)
p.drawPixmap(QtCore.QPoint(l, self.renderer.height-t), pixmap)
p.end()
self.blitbox = None
self.drawRect = False

差异形式的变化:

diff --git a/lib/matplotlib/backends/backend_qt4agg.py b/lib/matplotlib/backends/backend_qt4agg.py
index 8433731..718d352 100644
--- a/lib/matplotlib/backends/backend_qt4agg.py
+++ b/lib/matplotlib/backends/backend_qt4agg.py
@@ -118,7 +118,9 @@ class FigureCanvasQTAgg(FigureCanvasQT, FigureCanvasAgg):
qImage = QtGui.QImage(stringBuffer, self.renderer.width,
self.renderer.height,
QtGui.QImage.Format_ARGB32)
+ rect = qImage.rect()
p = QtGui.QPainter(self)
+ p.eraseRect(rect)
p.drawPixmap(QtCore.QPoint(0, 0), QtGui.QPixmap.fromImage(qImage))

# draw the zoom rectangle to the QPainter

您可以修改本地安装或在您的代码中对其进行猴子修补。

PR #2449已合并,将在 1.3.1

关于python - Matplotlib/PyQT4 : transparent figure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18944561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com