簡體   English   中英

在QFileDialog上選擇文件后,PyQt5應用程序關閉

[英]PyQt5 application closes after choosing file on QFileDialog

我試圖在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上單擊OK。 當我這樣做時,該應用程序將關閉。

使用全局變量是一種不好的編程習慣,在類中,最好將變量用作屬性。 您必須將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))

它是無聲的崩潰,還是崩潰時在屏幕上打印了任何信息?

無論如何,您可以使它成為Example類的屬性,而不是為orig_lbl創建全局變量。

例如,

...
self.orig_lbl = QLabel(self)
self.orig_lbl.setPixmap(orig_img)
...

然后,您可以在類的其他函數(例如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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM