在 QFileDialog 上选择文件后 PyQt5 应用程序关闭
PyQt5 application closes after choosing file on QFileDialog
我正在尝试在 PyQt5 上编写一个应用程序,它通过 QFileDialog 打开图像并将其显示在主 window 上。这是代码:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtWidgets import (QWidget, QLabel, QHBoxLayout, QVBoxLayout,
QApplication, QPushButton, QSlider,
QFileDialog, QAction)
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
path = 'image.png'
original_img_label = QLabel('Original')
processed_img_label = QLabel('Processed')
orig_img = QPixmap(path)
global orig_lbl
orig_lbl = QLabel(self)
orig_lbl.setPixmap(orig_img)
proc_img = QPixmap(path)
proc_lbl = QLabel(self)
proc_lbl.setPixmap(proc_img)
select_image_btn = QPushButton('Select image')
select_image_btn.clicked.connect(self.getImage)
clean_image_btn = QPushButton('Clean image')
thresh1_sld = QSlider(Qt.Horizontal, self)
thresh2_sld = QSlider(Qt.Horizontal, self)
v_orig_lay = QVBoxLayout()
v_orig_lay.addWidget(original_img_label)
v_orig_lay.addWidget(orig_lbl)
v_proc_lay = QVBoxLayout()
v_proc_lay.addWidget(processed_img_label)
v_proc_lay.addWidget(proc_lbl)
h_img_lay = QHBoxLayout()
h_img_lay.addStretch(1)
h_img_lay.addLayout(v_orig_lay)
h_img_lay.addStretch(1)
h_img_lay.addLayout(v_proc_lay)
h_img_lay.addStretch(1)
h_btn_lay = QHBoxLayout()
h_btn_lay.addStretch(1)
h_btn_lay.addWidget(select_image_btn)
h_btn_lay.addWidget(clean_image_btn)
h_btn_lay.addStretch(1)
v_main_lay = QVBoxLayout()
v_main_lay.addLayout(h_img_lay)
v_main_lay.addStretch(1)
v_main_lay.addWidget(thresh1_sld)
v_main_lay.addWidget(thresh2_sld)
v_main_lay.addLayout(h_btn_lay)
self.setLayout(v_main_lay)
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle('Review')
self.show()
def getImage(self):
filter = "Images (*.png *.jpg)"
image_obj = QFileDialog.getOpenFileName(self, 'Open image', 'Desktop', filter)
self.orig_lbl.setPixmap(QPixmap(image_obj))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
getImage函数由select_image_btn按钮调用,希望通过setPixmap将image_obj(图片路径)放在orig_lbl上。
一切顺利,直到我 select 一张图片并单击 FileDialog 上的“确定”。当我这样做时,应用程序关闭。
是静默死机,还是死机时屏幕上有打印信息?
无论如何,不用为 orig_lbl 创建全局变量,您可以将其设为示例 class 的属性。
例如,
...
self.orig_lbl = QLabel(self)
self.orig_lbl.setPixmap(orig_img)
...
然后,您可以在 class 的其他函数中引用它,例如 getImage(),就像您所做的那样:
...
self.orig_lbl.setPixmap(QPixmap(image_obj))
...
编辑:或者,您可以将其保留为全局的,但我认为您必须在访问它的每个函数中声明它,如下所示:
def getImage(self):
global orig_lbl
filter = "Images (*.png *.jpg)"
image_obj = QFileDialog.getOpenFileName(self, 'Open image', 'Desktop', filter)
orig_lbl.setPixmap(QPixmap(image_obj))
使用全局变量是一种糟糕的编程习惯,在 class 中最好将变量用作属性。您必须将 orig_lbl
更改为 self.orig_lbl
。
您遇到的另一个错误是 QFileDialog.getOpenFileName(..)
函数 returns 一个元组,其中第一个值是图像的位置,第二个值是您使用的滤镜。
def getImage(self):
filter = "Images (*.png *.jpg)"
image_obj, _ = QFileDialog.getOpenFileName(self, 'Open image', 'Desktop', filter)
self.orig_lbl.setPixmap(QPixmap(image_obj))
我正在尝试在 PyQt5 上编写一个应用程序,它通过 QFileDialog 打开图像并将其显示在主 window 上。这是代码:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtWidgets import (QWidget, QLabel, QHBoxLayout, QVBoxLayout,
QApplication, QPushButton, QSlider,
QFileDialog, QAction)
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
path = 'image.png'
original_img_label = QLabel('Original')
processed_img_label = QLabel('Processed')
orig_img = QPixmap(path)
global orig_lbl
orig_lbl = QLabel(self)
orig_lbl.setPixmap(orig_img)
proc_img = QPixmap(path)
proc_lbl = QLabel(self)
proc_lbl.setPixmap(proc_img)
select_image_btn = QPushButton('Select image')
select_image_btn.clicked.connect(self.getImage)
clean_image_btn = QPushButton('Clean image')
thresh1_sld = QSlider(Qt.Horizontal, self)
thresh2_sld = QSlider(Qt.Horizontal, self)
v_orig_lay = QVBoxLayout()
v_orig_lay.addWidget(original_img_label)
v_orig_lay.addWidget(orig_lbl)
v_proc_lay = QVBoxLayout()
v_proc_lay.addWidget(processed_img_label)
v_proc_lay.addWidget(proc_lbl)
h_img_lay = QHBoxLayout()
h_img_lay.addStretch(1)
h_img_lay.addLayout(v_orig_lay)
h_img_lay.addStretch(1)
h_img_lay.addLayout(v_proc_lay)
h_img_lay.addStretch(1)
h_btn_lay = QHBoxLayout()
h_btn_lay.addStretch(1)
h_btn_lay.addWidget(select_image_btn)
h_btn_lay.addWidget(clean_image_btn)
h_btn_lay.addStretch(1)
v_main_lay = QVBoxLayout()
v_main_lay.addLayout(h_img_lay)
v_main_lay.addStretch(1)
v_main_lay.addWidget(thresh1_sld)
v_main_lay.addWidget(thresh2_sld)
v_main_lay.addLayout(h_btn_lay)
self.setLayout(v_main_lay)
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle('Review')
self.show()
def getImage(self):
filter = "Images (*.png *.jpg)"
image_obj = QFileDialog.getOpenFileName(self, 'Open image', 'Desktop', filter)
self.orig_lbl.setPixmap(QPixmap(image_obj))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
getImage函数由select_image_btn按钮调用,希望通过setPixmap将image_obj(图片路径)放在orig_lbl上。
一切顺利,直到我 select 一张图片并单击 FileDialog 上的“确定”。当我这样做时,应用程序关闭。
是静默死机,还是死机时屏幕上有打印信息?
无论如何,不用为 orig_lbl 创建全局变量,您可以将其设为示例 class 的属性。
例如,
...
self.orig_lbl = QLabel(self)
self.orig_lbl.setPixmap(orig_img)
...
然后,您可以在 class 的其他函数中引用它,例如 getImage(),就像您所做的那样:
...
self.orig_lbl.setPixmap(QPixmap(image_obj))
...
编辑:或者,您可以将其保留为全局的,但我认为您必须在访问它的每个函数中声明它,如下所示:
def getImage(self):
global orig_lbl
filter = "Images (*.png *.jpg)"
image_obj = QFileDialog.getOpenFileName(self, 'Open image', 'Desktop', filter)
orig_lbl.setPixmap(QPixmap(image_obj))
使用全局变量是一种糟糕的编程习惯,在 class 中最好将变量用作属性。您必须将 orig_lbl
更改为 self.orig_lbl
。
您遇到的另一个错误是 QFileDialog.getOpenFileName(..)
函数 returns 一个元组,其中第一个值是图像的位置,第二个值是您使用的滤镜。
def getImage(self):
filter = "Images (*.png *.jpg)"
image_obj, _ = QFileDialog.getOpenFileName(self, 'Open image', 'Desktop', filter)
self.orig_lbl.setPixmap(QPixmap(image_obj))