一个简单的PyQt5小程序

以前学习PyQt5的时候做过的一个小程序,现在也把它整理上来。
这是运行时的主界面

主界面
主要功能类似与常用的看图软件,因为最初我的想法是把他做成一个功能比较类似PS的软件,所以当时名字设成了MyPS,结果仅仅完成了九牛一毛。。。


以下是完整代码:

1.CVshopmainwindow.py

从designer设计界面,转成的代码。主要是定义了主窗口以及一些信号槽

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'CVshopmainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.11.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(900, 600)
        MainWindow.setMinimumSize(QtCore.QSize(900, 600))
        MainWindow.setMaximumSize(QtCore.QSize(900, 600))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setText("")
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 900, 23))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        self.menuOpen = QtWidgets.QMenu(self.menu)
        self.menuOpen.setObjectName("menuOpen")
        self.menuTools = QtWidgets.QMenu(self.menubar)
        self.menuTools.setObjectName("menuTools")
        self.menuVideo = QtWidgets.QMenu(self.menubar)
        self.menuVideo.setObjectName("menuVideo")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.toolBar = QtWidgets.QToolBar(MainWindow)
        self.toolBar.setObjectName("toolBar")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
        self.actionExit = QtWidgets.QAction(MainWindow)
        self.actionExit.setObjectName("actionExit")
        self.actionRotate = QtWidgets.QAction(MainWindow)
        self.actionRotate.setObjectName("actionRotate")
        self.actionFlip = QtWidgets.QAction(MainWindow)
        self.actionFlip.setObjectName("actionFlip")
        self.actionCamera = QtWidgets.QAction(MainWindow)
        self.actionCamera.setObjectName("actionCamera")
        self.actionFile = QtWidgets.QAction(MainWindow)
        self.actionFile.setObjectName("actionFile")
        self.actionSnip = QtWidgets.QAction(MainWindow)
        self.actionSnip.setObjectName("actionSnip")
        self.actionZoomIn = QtWidgets.QAction(MainWindow)
        self.actionZoomIn.setObjectName("actionZoomIn")
        self.actionZoomOut = QtWidgets.QAction(MainWindow)
        self.actionZoomOut.setObjectName("actionZoomOut")
        self.actionSaveAs = QtWidgets.QAction(MainWindow)
        self.actionSaveAs.setObjectName("actionSaveAs")
        self.actionSave = QtWidgets.QAction(MainWindow)
        self.actionSave.setObjectName("actionSave")
        self.actionRecord = QtWidgets.QAction(MainWindow)
        self.actionRecord.setObjectName("actionRecord")
        self.menuOpen.addAction(self.actionFile)
        self.menuOpen.addAction(self.actionCamera)
        self.menu.addAction(self.menuOpen.menuAction())
        self.menu.addAction(self.actionSave)
        self.menu.addAction(self.actionSaveAs)
        self.menu.addAction(self.actionExit)
        self.menuTools.addAction(self.actionFlip)
        self.menuTools.addAction(self.actionRotate)
        self.menuTools.addAction(self.actionZoomIn)
        self.menuTools.addAction(self.actionZoomOut)
        self.menuVideo.addAction(self.actionSnip)
        self.menuVideo.addAction(self.actionRecord)
        self.menubar.addAction(self.menu.menuAction())
        self.menubar.addAction(self.menuTools.menuAction())
        self.menubar.addAction(self.menuVideo.menuAction())
        self.toolBar.addAction(self.actionSnip)
        self.toolBar.addAction(self.actionFlip)
        self.toolBar.addAction(self.actionRotate)

        self.retranslateUi(MainWindow)
        self.actionExit.triggered.connect(MainWindow.close)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menu.setTitle(_translate("MainWindow", "File"))
        self.menuOpen.setTitle(_translate("MainWindow", "Open"))
        self.menuTools.setTitle(_translate("MainWindow", "Tools"))
        self.menuVideo.setTitle(_translate("MainWindow", "Video"))
        self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
        self.actionExit.setText(_translate("MainWindow", "Exit"))
        self.actionRotate.setText(_translate("MainWindow", "Rotate"))
        self.actionFlip.setText(_translate("MainWindow", "Flip"))
        self.actionCamera.setText(_translate("MainWindow", "Camera"))
        self.actionFile.setText(_translate("MainWindow", "File"))
        self.actionFile.setShortcut(_translate("MainWindow", "Ctrl+O"))
        self.actionSnip.setText(_translate("MainWindow", "Snip"))
        self.actionZoomIn.setText(_translate("MainWindow", "Zoom In"))
        self.actionZoomOut.setText(_translate("MainWindow", "Zoom Out"))
        self.actionSaveAs.setText(_translate("MainWindow", "Save as"))
        self.actionSaveAs.setToolTip(_translate("MainWindow", "Save File"))
        self.actionSaveAs.setShortcut(_translate("MainWindow", "F2"))
        self.actionSave.setText(_translate("MainWindow", "Save"))
        self.actionSave.setToolTip(_translate("MainWindow", "Save Image"))
        self.actionSave.setShortcut(_translate("MainWindow", "Ctrl+S"))
        self.actionRecord.setText(_translate("MainWindow", "Record"))

2.MyPS.py

#!/usr/bin/python
#coding:utf-8 
"""
@author: SPRATUMN
@software: PyCharm
@file: MyPS.py
@time: 2018/9/16 22:02
"""
import CVshopmainwindow
import cv2 as cv
import numpy as np
import sys
from PyQt5.QtWidgets import QMainWindow, QMessageBox, QFileDialog, QApplication
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import Qt


# 主窗口类,继承窗口Ui_MainWindow主界面
class MyPS(QMainWindow, CVshopmainwindow.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # 窗口属性修改
        self.setWindowTitle('PS')
        self.label.setAlignment(Qt.AlignCenter)
        self.actionSnip.setDisabled(True)
        self.actionRecord.setDisabled(True)
        # 实例属性初始化
        self.cap = cv.VideoCapture(0)
        self.fName = ''
        self.mat = np.zeros([1, 1, 3], np.uint8)
        # 信号槽连接
        self.actionFile.triggered.connect(self.load_file)
        self.actionCamera.triggered.connect(self.open_camera)
        self.actionRotate.triggered.connect(self.rotate_image)
        self.actionFlip.triggered.connect(self.flip_image)
        self.actionSnip.triggered.connect(self.snip_image)
        self.actionRecord.triggered.connect(self.record_camera)

    # 加载文件,根据后缀判断文件类型
    def load_file(self):
        if self.cap.isOpened():
            self.cap.release()
            self.actionSnip.setDisabled(True)
        self.fName = QFileDialog.getOpenFileName(self, 'Open File', './',
                                                 'Image Files (*.png *.jpg *.bmp);;Video Files (*.mp4 *.mkv)')
        if self.fName[0].endswith('png') or self.fName[0].endswith('jpg') or self.fName[0].endswith('bmp'):
            self.mat = cv.imread(self.fName[0])
            self.display_image(self.mat)
        elif self.fName[0].endswith('mp4') or self.fName[0].endswith('mkv'):
            QMessageBox.warning(self, 'Warning', 'video file', QMessageBox.Ok)
            self.cap.open(self.fName[0])
            while self.cap.isOpened():
                self.actionSnip.setEnabled(True)
                self.actionRecord.setEnabled(True)
                ret, cam_img = self.cap.read()
                if ret:
                    self.display_image(cam_img)
                    cv.waitKey(33)

    # 打开摄像头
    def open_camera(self):
        self.cap = cv.VideoCapture(0)
        if self.cap.isOpened():
            self.cap.release()
        if self.cap.open(0):
            while self.cap.isOpened():
                self.actionSnip.setEnabled(True)
                self.actionRecord.setEnabled(True)
                ret, cam_img = self.cap.read()
                if ret:
                    self.display_image(cam_img)
                    cv.waitKey(33)
        else:
            QMessageBox.warning(self, 'Error', 'Open camera fail', QMessageBox.Ok)

    # 录制摄像头视频
    def record_camera(self):
        pass

    # 获取视频当前帧的图片
    def snip_image(self):
        if self.cap.isOpened():
            ret, self.mat = self.cap.read()
            if ret:
                self.actionSnip.setDisabled(True)
                self.actionRecord.setDisabled(True)
                self.display_image(self.mat)
                self.cap.release()

    # 使用label显示图片
    def display_image(self, imge):
        height, width, channels = imge.shape
        if height > 400 or width > 800:
            rate = height / 400 if height / 400 > width / 800 else width / 800
            width = int(width / rate)
            height = int(height / rate)
            img = cv.resize(imge, (width, height))
        else:
            img = imge
        self.statusbar.showMessage('img size:({},{})'.format(width, height))
        self.statusbar.show()
        line_bytes = channels * width
        qt_image = cv.cvtColor(img, cv.COLOR_BGR2RGB)
        label_image: QImage = QImage(qt_image.data, width, height, line_bytes, QImage.Format_RGB888)
        self.label.setPixmap(QPixmap.fromImage(label_image))

    def mousePressEvent(self, event):
        print('clicked at (', event.x(), ',', event.y(), ')')

    def closeEvent(self, *args, **kwargs):
        self.cap.release()

    def rotate_image(self):
        self.mat = cv.transpose(self.mat)
        self.mat = cv.flip(self.mat, 1)
        self.display_image(self.mat)

    def flip_image(self):
        self.mat = cv.flip(self.mat, 1)
        self.display_image(self.mat)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyPS()
    w.show()
    sys.exit(app.exec_())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值