gpt4 book ai didi

python-2.7 - 当我的 PyQt 窗口变为非事件状态/调整大小时,为什么 Python 会崩溃?

转载 作者:行者123 更新时间:2023-12-03 15:52:58 24 4
gpt4 key购买 nike

在尝试在 PyQt4 窗口中显示网络摄像头提要(使用 imageio/ffmpeg 获得)的不同方式时,我偶然发现了 this answer .在 Python 2.7 中将其实现为 ImageDisplayWidget 之后类(如下所述),一切似乎都很好:打开一个窗口,显示我的网络摄像头提要没有故障。如果我关上 window ,一切都会停止并整齐地关闭。

但是...每当我单击此 PyQt 窗口外的任何位置(当它显示网络摄像头提要时),导致它失去焦点时,Python.exe 会因未处理的 win32 异常而崩溃。当我尝试调整窗口大小时也会发生同样的情况。

我可能犯了某种非常愚蠢的初学者错误,但我只是不明白。谁能指出我正确的方向?我是否违反了(Py)Qt 甚至 Python 的一些基本规则?

这是一个最小的例子:

import sys
import numpy
from PIL import Image, ImageQt # pillow
from PyQt4 import QtGui, QtCore


class DummyVideoGrabber(QtCore.QTimer):
signal_image_available = QtCore.pyqtSignal(QtGui.QImage)

def __init__(self):
super(DummyVideoGrabber, self).__init__()
self.timeout.connect(self.update_image)
self.counter = 0

def update_image(self):
# Dummy rgb image (in reality we get a numpy array from imageio's Reader)
self.counter += 1
numpy_image = numpy.zeros(shape=(480, 640, 3), dtype=numpy.int8)
numpy_image[:, :, self.counter%3] = 255
qt_image = ImageQt.ImageQt(Image.fromarray(numpy_image, mode='RGB'))

# Emit image
self.signal_image_available.emit(qt_image)


class ImageDisplayWidget(QtGui.QWidget):
"""
Custom widget that displays an image using QPainter.

Mostly copied from: https://stackoverflow.com/a/22355028/4720018

"""
def __init__(self, size_wxh=None, parent=None):
super(ImageDisplayWidget, self).__init__(parent)
self.image = QtGui.QImage()

def set_image(self, qimage, resize_window=False):
self.image = qimage
self.repaint()

def paintEvent(self, QPaintEvent):
if not self.image:
return
painter = QtGui.QPainter(self)
painter.drawImage(self.rect(), self.image, self.image.rect())

app = QtGui.QApplication(sys.argv)

# instantiate a display object
display = ImageDisplayWidget()
display.resize(640, 480)
display.show()

# instantiate a grabber object
grabber = DummyVideoGrabber()
grabber.signal_image_available.connect(display.set_image)
grabber.start(100) # timer interval in ms

# start the event loop
app.exec_()

我发现可以通过添加 wasActiveWindow 来防止崩溃标志(在构造函数中初始化为 True)并封装 drawImage()像这样调用一些逻辑:
        if self.isActiveWindow():
if self.wasActiveWindow:
painter.drawImage(self.rect(), self.image, self.image.rect())
self.wasActiveWindow = True
else:
self.wasActiveWindow = False

但是,调整窗口大小仍然会使 python 崩溃。

最佳答案

通过保留对 qt_image 的引用解决了问题如self.qt_image :

...
# Emit image
self.qt_image = ImageQt.ImageQt(Image.fromarray(numpy_image, mode='RGB'))
self.signal_image_available.emit(self.qt_image)
...

这样它就可以正常工作。不需要 self.wasActiveWindow解决方法了。

仍然不确定为什么不保留引用会导致低级 python 崩溃...

关于python-2.7 - 当我的 PyQt 窗口变为非事件状态/调整大小时,为什么 Python 会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46435507/

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