メッセージボックスが表示されています。既に表示されているウィンドウのQLabelにイメージを読み込むと「Pythonが動作しなくなりました。デバッグショーの選択:Python.exeで未処理のWin32例外が発生しました。Python3 + Pillow + QT5:イメージを含むラベルのサイズを変更するとクラッシュする
ウィンドウを表示する前にイメージをラベルにロードすると、正しく表示されます。
は、ここでストリップダウンコードです:
#!/usr/bin/etc python
import sys
import os
import stat
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PIL import *
from PIL.ImageQt import *
def update(label):
filename = r"C:\Users\me\Pictures\images\00000229.jpg"
im1 = Image.open(filename)
print ("Read ({},{})".format(im1.width, im1.height))
im2 = im1.rotate(90, expand=True)
print("Rotate ({},{})".format(im2.width, im2.height))
im2.thumbnail((1200,1200))
print("Thumbnail({},{})".format(im2.width, im2.height))
qimage = ImageQt(im2)
pixmap = QPixmap.fromImage(qimage)
label.setPixmap(pixmap)
app = QApplication(sys.argv)
desktop = QDesktopWidget()
deskGeometry = desktop.availableGeometry()
print("desktop ({},{})".format(deskGeometry.width(), deskGeometry.height()))
window = QFrame()
# If you let QT pick the sizes itself, it picks dumb ones, then complains
# 'cause they are dumb
window.setMinimumSize(300, 200)
window.setMaximumSize(deskGeometry.width(), deskGeometry.height())
label = QLabel()
#call update here: no crash
caption = QLabel()
caption.setText("Hello world")
box = QVBoxLayout()
box.addWidget(label)
box.addWidget(caption)
#call update here, no crash
window.setLayout(box)
#call update here, no crash
window.show()
#this call to update results in a crash
update(label)
#window.updateGeometry()
print("App: exec")
app.exec_()
出力:
desktop (3623,2160)
Read (1515,1051)
Rotate (1051,1515)
Thumbnail(832,1200)
App: exec
私はQTを教えてウィンドウサイズが変更されることをするために特別な何かをする必要がありますか?ここから問題を診断するための任意の提案...
がアップデート:私は更新関数の本体をコピーし、更新するための呼び出しの代わりに貼り付けた場合、それは長い
をクラッシュしません - 期待どおりに動作します。
これから私は、オブジェクトライフタイムの問題があると結論づけます。舞台裏のどこかで、QTや枕はバッファのコピーや "盗み"を作るのではなく、内部のバッファへのポインタを保持しています。バッファを含むオブジェクトは、ポインタが無効になり削除され、怠けています誰が決定するために今すぐ
「悪いことは[TM]が起こる」...
私が行っていました基本的なイメージデータへの参照を保持する必要があることを示唆していますが、実際に問題を自分で再現することはできませんでしたが、とにかく、これらの種類のガベージコレクションの問題はよく知られているので、珍しいここに行く – ekhumoro
''私はオブジェクトの生涯の問題を欲しかったPythonではなくC++でプログラムを作成します。 ' '問題を見ていただきありがとうございます。 –