Skip to main content
 首页 » 编程设计

python之在 QFileDialog 上选择文件后 PyQt5 应用程序关闭

2025年05月04日7grandyang

我正在尝试在 PyQt5 上编写一个应用程序,该应用程序通过 QFileDialog 打开图像并将其显示在主窗口中。这是代码:

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上。

在我选择一个图像并单击 FileDialog 上的“确定”之前,一切都很顺利。当我这样做时,应用程序关闭。

请您参考如下方法:

使用全局变量是一种糟糕的编程习惯,在类中最好将变量用作属性。您必须将 orig_lbl 更改为 self.orig_lbl。

您遇到的另一个错误是 QFileDialog.getOpenFileName(..) 函数返回一个元组,其中第一个值是图像的位置,第二个值是您使用的过滤器。

def getImage(self): 
 
    filter = "Images (*.png *.jpg)" 
    image_obj, _ = QFileDialog.getOpenFileName(self, 'Open image', 'Desktop', filter) 
    self.orig_lbl.setPixmap(QPixmap(image_obj))