Python 如何使用PyQT5中的按钮单击在单独的窗口中打开图像?

Python 如何使用PyQT5中的按钮单击在单独的窗口中打开图像?,python,pyqt5,Python,Pyqt5,我将代码设置为实现一种算法,以便在从弹出对话框中选择图像时修改图像。我试图做到的是,当我单击加密按钮时,图像会在一个单独的窗口中弹出。除了窗口本身,我似乎无法在单独的窗口中弹出任何东西。任何帮助都将不胜感激。您至少有以下错误: 正在将创建的“hbox”添加到窗口而不是QDialog:self.setLayout(hbox),它必须是mydialog.setLayout(hbox) 不要对两个不同的对象使用相同的名称,因为它们可能会导致问题,在您的情况下,有两个QPushButton分配给变量“

我将代码设置为实现一种算法,以便在从弹出对话框中选择图像时修改图像。我试图做到的是,当我单击加密按钮时,图像会在一个单独的窗口中弹出。除了窗口本身,我似乎无法在单独的窗口中弹出任何东西。任何帮助都将不胜感激。

您至少有以下错误:

  • 正在将创建的“hbox”添加到窗口而不是QDialog:
    self.setLayout(hbox)
    ,它必须是
    mydialog.setLayout(hbox)

  • 不要对两个不同的对象使用相同的名称,因为它们可能会导致问题,在您的情况下,有两个QPushButton分配给变量“self.button2”

  • 您尝试使用变量“self.label”,但从不相信它

考虑到上述情况,我们可以进行以下改进:

  • 使用更具描述性的名称来轻松区分其功能

  • 如果要创建一个具有不同目标的窗口,最好创建一个类

上述方法避免了上述问题,考虑到上述情况,解决方案是:

导入系统 从PyQt5.QtGui导入QPixmap 从PyQt5.QtWidgets导入( QApplication, QDialog, QFileDialog, QHBoxLayout, QLabel, QPushButton, QVBoxLayout, QWidget, ) 导入更新的\u加密 类对话框(QDialog): def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) self.load\u image\u btn=QPushButton(“检查图像”) self.load\u image\u btn.clicked.connect(self.load\u image) self.image_lbl=QLabel() lay=QVBoxLayout(自身) lay.addWidget(self.load\u image\u btn) lay.addWidget(self.image\u lbl) def加载_映像(自身): image\u path,\uqfiledialog.getOpenFileName(self,“OpenFile”、“”、“”) 如果图像路径: updateImage=Updated\u encrypt.decrypt(图像路径,123) pixmap=QPixmap(更新图像) self.image\u lbl.setPixmap(QPixmap(pixmap)) 类窗口(QWidget): def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) self.title=“加密/解密” self.InitWindow() def初始化窗口(自): self.setWindowTitle(self.title) self.setGeometry(200500400300) self.encrypt\u btn=QPushButton(“加密”) self.encrypt\u btn.clicked.connect(self.openSecondDialog) self.decrypt_btn=QPushButton(“解密”) vbox=QVbox布局(自) vbox.addWidget(self.encrypt_btn) vbox.addWidget(self.decrypt_btn) def openSecondDialog(自我): 对话=对话(自我) dialog.show() 如果名称=“\uuuuu main\uuuuuuuu”: app=QApplication(sys.argv) window=window() window.show() sys.exit(app.exec())
谢谢。我最近刚开始在我的课堂项目中使用PyQt5,在实现这一点上遇到了很多困难。YouTube上的指南一点帮助都没有。@StephenAgbenu建议:1)通过测试和理解互联网上的示例来强化基础知识。2) 避免使用YT进行学习,因为除了必须等待观看整个视频(平均需要10分钟),你还可以在网站上用几秒钟的教程来代替它。如果你不介意的话,还有一个问题。在完成load image函数内的操作后,Gui最终崩溃,然后出现python问题报告弹出窗口,我如何使它只关闭第二个对话框而不是第二个和主对话框窗口?
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QFileDialog, QPushButton, QLineEdit,QVBoxLayout, QHBoxLayout
from PyQt5.QtCore import *
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QDialog, QVBoxLayout
import Updated_encrypt
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.title = 'Encrypt/Decrypt'
        self.top = 200
        self.left = 500
        self.width = 400
        self.height = 300

        self.InitWindow()

    def InitWindow(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        vbox = QVBoxLayout()

        self.button1 = QPushButton('Encrypt')
        self.button1.clicked.connect(self.openSecondDialog)

        self.button2 = QPushButton('Decrypt')

        vbox.addWidget(self.button1)
        vbox.addWidget(self.button2)

        self.setLayout(vbox)

        self.show()

    def openSecondDialog(self):
        hbox = QVBoxLayout()
        mydialog = QDialog(self)
        mydialog.show()

        self.button2 = QPushButton('Check Image')
        self.button2.clicked.connect(self.getImage)
        hbox.addWidget(self.button2)
        self.setLayout(hbox)
        self.show()

    def getImage(self):
         hbox = QHBoxLayout()
         file_Name = QFileDialog.getOpenFileName(self,
                                                'OpenFile',
                                                '',
                                                '')
         image_path = file_Name[0]
         updatedImage = Updated_encrypt.decrypt(image_path, 123)
         pixmap = QPixmap(updatedImage)
         self.label.setPixmap(QPixmap(pixmap))
         self.resize(pixmap.width(), pixmap.height())

App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())