python gui编程总结

各种对话框及文件保存

# coding:utf-8
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt, pyqtSignal, QTimer



class MyWindow(QWidget):

  def __init__(self):

    super().__init__()

    self.setWindowTitle('PyQt5 弹出窗口(框)大全')
    self.resize(400, 300)

    # 全局布局(注意参数 self)
    wl = QVBoxLayout(self)

    # 局部布局
    h1 = QHBoxLayout() # 输入框
    h2 = QHBoxLayout() # 消息窗口
    h3 = QHBoxLayout() # 文件(夹)打开,保存
    h4 = QHBoxLayout() # 颜色、字体、自定义


    btn11 = QPushButton('输入:整数')
    btn12 = QPushButton('输入:小数')
    btn13 = QPushButton('输入:文本')
    btn14 = QPushButton('输入:多文')
    btn15 = QPushButton('输入:选项')

    btn21 = QPushButton('消息:信息')
    btn22 = QPushButton('消息:问答')
    btn23 = QPushButton('消息:警告')
    btn24 = QPushButton('消息:危险')
    btn25 = QPushButton('消息:关于')

    btn31 = QPushButton('文件:文件夹')
    btn32 = QPushButton('文件:单文件')
    btn33 = QPushButton('文件:多文件')
    btn34 = QPushButton('文件:保存')
    btn35 = QPushButton('文件:另存为')

    btn41 = QPushButton('颜色')
    btn42 = QPushButton('字体')
    btn43 = QPushButton('自定义')

    for btn in (btn11, btn12, btn13, btn14, btn15):
      h1.addWidget(btn)

    for btn in (btn21, btn22, btn23, btn24, btn25):
      h2.addWidget(btn)

    for btn in (btn31, btn32, btn33, btn34, btn35):
      h3.addWidget(btn)

    for btn in (btn41, btn42, btn43):
      h4.addWidget(btn)

    btn11.clicked.connect(self.do_btn11) # 输入:整数
    btn12.clicked.connect(self.do_btn12) # 输入:小数
    btn13.clicked.connect(self.do_btn13) # 输入:文本
    btn14.clicked.connect(self.do_btn14) # 输入:多文
    btn15.clicked.connect(self.do_btn15) # 输入:选项

    btn21.clicked.connect(self.do_btn21) # 消息:信息
    btn22.clicked.connect(self.do_btn22) # 消息:问答
    btn23.clicked.connect(self.do_btn23) # 消息:警告
    btn24.clicked.connect(self.do_btn24) # 消息:危险
    btn25.clicked.connect(self.do_btn25) # 消息:关于

    btn31.clicked.connect(self.do_btn31) # 文件:文件夹
    btn32.clicked.connect(self.do_btn32) # 文件:单文件
    btn33.clicked.connect(self.do_btn33) # 文件:多文件
    btn34.clicked.connect(self.do_btn34) # 文件:保存
    btn35.clicked.connect(self.do_btn35) # 文件:另存为

    btn41.clicked.connect(self.do_btn41) # 颜色
    btn42.clicked.connect(self.do_btn42) # 字体
    btn43.clicked.connect(self.do_btn43) # 自定义

    # 加到全局布局
    wl.addLayout(h1)
    wl.addLayout(h2)
    wl.addLayout(h3)
    wl.addLayout(h4)

    self.window2 = MyWindow2()             # 自定义窗口
    self.window2.before_close_signal.connect(self.echo) # 接收自定义窗口关闭时发送过来的信号,交给 echo 函数显示


  def echo(self, value):
    '''显示对话框返回值'''
    QMessageBox.information(self, "返回值",  "得到:{}\n\ntype: {}".format(value, type(value)), QMessageBox.Yes | QMessageBox.No)
    #pass

  # =====================================================================
  def do_btn11(self, event): # 输入:整数
    #后面四个数字的作用依次是 初始值 最小值 最大值 步幅
    value, ok = QInputDialog.getInt(self, "输入框标题", "这是提示信息\n\n请输入整数:", 37, -10000, 10000, 2)
    #self.echo(value)

  def do_btn12(self, event): # 输入:小数
    #后面四个数字的作用依次是 初始值 最小值 最大值 小数点后位数
    value, ok = QInputDialog.getDouble(self, "输入框标题", "这是提示信息\n\n请输入整数:", 37.56, -10000, 10000, 2)
    self.echo(value)

  def do_btn13(self, event): # 输入:文本
    #第三个参数表示显示类型,可选,有正常(QLineEdit.Normal)、密碼( QLineEdit. Password)、不显示( QLineEdit. NoEcho)三种情况
    value, ok = QInputDialog.getText(self, "输入框标题", "这是提示信息\n\n请输入文本:", QLineEdit.Normal, "这是默认值")
    self.echo(value)

  def do_btn14(self, event): # 输入:多文
    value, ok = QInputDialog.getMultiLineText(self, "输入框标题", "这是提示信息\n\n请输入地址:", "默认的\n我的地址是\n中国广东广州番禺")
    self.echo(value)

  def do_btn15(self, event): # 输入:选项
    #1为默认选中选项目,True/False 列表框是否可编辑。
    items = ["Spring", "Summer", "Fall", "Winter"]
    value, ok = QInputDialog.getItem(self, "输入框标题", "这是提示信息\n\n请选择季节:", items, 1, True)
    self.echo(value)

  # =====================================================================
  def do_btn21(self, event): # 消息:信息
    reply = QMessageBox.information(self,
                  "消息框标题",
                  "这是一条消息。",
                  QMessageBox.Yes | QMessageBox.No)
    self.echo(reply)

  def do_btn22(self, event): # 消息:问答
    reply = QMessageBox.question(self,
                  "消息框标题",
                  "这是一条问答吗?",
                  QMessageBox.Yes | QMessageBox.No)
    self.echo(reply)

  def do_btn23(self, event): # 消息:警告
    reply = QMessageBox.warning(self,
                  "消息框标题",
                  "这是一条警告!",
                  QMessageBox.Yes | QMessageBox.No)
    self.echo(reply)

  def do_btn24(self, event): # 消息:危险
    reply = QMessageBox.ctitical(self,
                  "消息框标题",
                  "危险!程序即将强制退出!!!\n\n这个按钮再也点不开。",
                  QMessageBox.Yes | QMessageBox.No)
    self.echo(reply)

  def do_btn25(self, event): # 消息:关于
    reply = QMessageBox.about(self,
                  "消息框标题",
                  "这是关于软件的说明。。。",
                  QMessageBox.Yes | QMessageBox.No)
    self.echo(reply)

  # =====================================================================
  def do_btn31(self, event): # 文件:文件夹
    dir = QFileDialog.getExistingDirectory(self,
                  "选取文件夹",
                  "C:/")         # 起始路径
    self.echo(dir)

  def do_btn32(self, event): # 文件:单文件
    file_, filetype = QFileDialog.getOpenFileName(self,
                  "选取文件",
                  "C:/",
                  "All Files (*);;Text Files (*.txt)")  #设置文件扩展名过滤,注意用双分号间隔
    self.echo(file_)

  def do_btn33(self, event): # 文件:多文件
    files, ok = QFileDialog.getOpenFileNames(self,
                  "多文件选择",
                  "C:/",
                  "All Files (*);;Text Files (*.txt)")
    self.echo(files)

  def do_btn34(self, event): # 文件:保存
    file_, ok = QFileDialog.getSaveFileName(self,
                  "文件保存",
                  "C:/",
                  "All Files (*);;Text Files (*.txt)")
    self.echo(file_)

  def do_btn35(self, event): # 文件:另存为
    file_, ok = QFileDialog.getSaveFileName(self,
                  "文件另存为",
                  "C:/",
                  "All Files (*);;Text Files (*.txt)")
    self.echo(file_)

  # =====================================================================
  def do_btn41(self, event): # 颜色
    color = QColorDialog.getColor(Qt.blue, self, "Select Color")
    self.echo(color)

  def do_btn42(self, event): # 字体
    font, ok = QFontDialog.getFont()
    self.echo(font)

  def do_btn43(self, event): # 自定义

    self.window2.show()


class MyWindow2(QWidget):
  '''自定义窗口'''
  # 知识点:
  # 1.为了得到返回值用到了自定义的信号/槽
  # 2.为了显示动态数字,使用了计时器

  before_close_signal = pyqtSignal(int)    # 自定义信号(int类型)

  def __init__(self):
    super().__init__()

    self.sec = 0
    self.setWindowTitle('自定义窗口')
    self.resize(200,150)

    self.lcd = QLCDNumber(18, self)
    btn1 = QPushButton(self, text="测试")
    btn2 = QPushButton(self, text="关闭")

    layout = QVBoxLayout(self)
    layout.addWidget(self.lcd)
    layout.addWidget(btn1)
    layout.addWidget(btn2)

    self.timer = QTimer()

    self.timer.timeout.connect(self.update) # 每次计时结束,触发update
    btn1.clicked.connect(self.startTimer)
    btn2.clicked.connect(self.stopTimer)  # 去到关闭前的处理

  def update(self):
    self.sec += 1
    self.lcd.display(self.sec)       # LED显示数字+1

  def startTimer(self):
    self.timer.start(1000)         # 计时器每秒计数

  def stopTimer(self):
    self.timer.stop()
    self.sec = 0
    self.before_close_signal.emit(self.lcd.value()) # 发送信号,带参数 888
    self.close()              # 然后窗口关闭

  # 默认关闭事件
  def closeEvent(self, e):
    self.stopTimer()

if __name__=="__main__":
  import sys

  app = QApplication(sys.argv)
  win = MyWindow()
  win.show()
  sys.exit(app.exec_())

pyqt5和opencv结合,将图片矩阵转为Qpixmap显示以及判断灰度图和彩色图

 #!/usr/bin/python3
# -*- coding: utf-8 -*-
from PIL import Image
import sys
import cv2 as cv
import numpy as np
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import (QApplication, QDialog, QFileDialog, QGridLayout,
                             QLabel, QPushButton)

class win(QDialog):
    def __init__(self):

        # 初始化一个img的ndarray, 用于存储图像
        self.img = np.ndarray(())

        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(400, 300)
        self.btnOpen = QPushButton('Open', self)
        self.btnSave = QPushButton('Save', self)
        self.btnProcess = QPushButton('Process', self)
        self.btnQuit = QPushButton('Quit', self)
        self.label = QLabel()

        # 布局设定
        layout = QGridLayout(self)
        layout.addWidget(self.label, 0, 1, 3, 4)
        layout.addWidget(self.btnOpen, 4, 1, 1, 1)
        layout.addWidget(self.btnSave, 4, 2, 1, 1)
        layout.addWidget(self.btnProcess, 4, 3, 1, 1)
        layout.addWidget(self.btnQuit, 4, 4, 1, 1)

        # 信号与槽连接, PyQt5与Qt5相同, 信号可绑定普通成员函数
        self.btnOpen.clicked.connect(self.openSlot)
        self.btnSave.clicked.connect(self.saveSlot)
        self.btnProcess.clicked.connect(self.processSlot)
        self.btnQuit.clicked.connect(self.close)

    def openSlot(self):
        # 调用打开文件diglog
        fileName, tmp = QFileDialog.getOpenFileName(
            self, 'Open Image', './__data', '*.png *.jpg *.bmp')

        if fileName is '':
            return
        # 采用opencv函数读取数据
        #self.img = cv.imread(fileName, -1)
        self.img = cv.imread(fileName, -1)
        if self.img.size == 1:
            return

        self.refreshShow()

    def saveSlot(self):
        # 调用存储文件dialog
        fileName, tmp = QFileDialog.getSaveFileName(
            self, 'Save Image', './__data', '*.png *.jpg *.bmp', '*.png')

        if fileName is '':
            return
        if self.img.size == 1:
            return

        # 调用opencv写入图像
        cv.imwrite(fileName, self.img)

    def processSlot(self):
        if self.img.size == 1:
            return

        # 对图像做模糊处理, 窗口设定为5x5
        self.img = cv.blur(self.img, (5, 5))
        #self.img = cv.cvtColor(self.img,cv.COLOR_BGR2GRAY)
        self.refreshShow()

    def refreshShow(self):
        # 提取图像的尺寸和通道, 用于将opencv下的image转换成Qimage
        if(len(self.img.shape)==3):
            height, width, channel = self.img.shape
        else:
            height, width =self.img.shape

        bytesPerLine = 3 * width

        if(len(self.img.shape)==3):
            print("3-------channel----->")
            self.qImg = QImage(self.img.data, width, height, bytesPerLine,
                           QImage.Format_RGB888).rgbSwapped()
            # 将Qimage显示出来
            self.label.setPixmap(QPixmap.fromImage(self.qImg))
        else:
            print("2-------channel----->")
            self.qImg = QImage(self.img.data, width, height, bytesPerLine,
                           QImage.Format_Grayscale8)  #Format_Grayscale16或者 QImage.Format_Indexed8
            a=QPixmap.fromImage(self.qImg)
            cv.imshow("a",self.img)

            """
            img = Image.fromarray(data, 'RGB')
            img.save('my.png')
            img.show()
            """
if __name__ == '__main__':
    a = QApplication(sys.argv)
    w = win()
    w.show()
    sys.exit(a.exec_())

在这里插入图片描述
然后就是综合了

# coding:utf-8

import sys
import qtawesome
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import cv2 as cv
import numpy as np
import recognize

#处理
import medianBlur

class MainUi(QMainWindow):
    def __init__(self):
        super().__init__()
        self.img_path="img/lenna.jpg"
        self.init_ui()

    def saveFun(self):
        file_, ok = QFileDialog.getSaveFileName(self,
                  "文件保存",
                  "C:/",
                  "All Files (*);;Text Files (*.txt)")
        src=cv.imread(self.img_path)
        cv.imwrite(file_,src)

    def recog_digit(self):
        recognize.load_model(self.img_path)



    def detect_face(self):
        img = cv.imread(self.img_path) # 读取图片
        gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 转换灰色
        # OpenCV人脸识别分类器
        #这里要使用python pip安装的opencv的数据的目录
        classifier = cv.CascadeClassifier( "D:/softManager/install/Python/Python36/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml" )
        color = (0, 255, 0) # 定义绘制颜色
        # 调用识别人脸
        faceRects = classifier.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
        if len(faceRects): # 大于0则检测到人脸
            for faceRect in faceRects: # 单独框出每一张人脸
                x, y, w, h = faceRect
                # 框出人脸
                cv.rectangle(img, (x, y), (x + h, y + w), color, 2)
                # 左眼
                #cv2.circle(img, (x + w // 4, y + h // 4 + 30), min(w // 8, h // 8), color)
                #右眼
                #cv2.circle(img, (x + 3 * w // 4, y + h // 4 + 30), min(w // 8, h // 8), color)
                #嘴巴
                #cv2.rectangle(img, (x + 3 * w // 8, y + 3 * h // 4), (x + 5 * w // 8, y + 7 * h // 8), color)
        #cv.imshow("im", img) # 显示图像
        cv.imwrite("tempImg.jpg",img)
        self.recommend_button_1.setIcon(QIcon('tempImg.jpg'))
        self.img_path="tempImg.jpg"

    def hist_equalization(self):
        src=cv.imread(self.img_path)
        gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)
        dst=cv.equalizeHist(gray)
        cv.imwrite("tempImg.jpg",dst)
        self.recommend_button_1.setIcon(QIcon('tempImg.jpg'))
        self.img_path="tempImg.jpg"
        #cv.imshow("equalizeHist",dst)

    def grab_cut(self):
        # 读取图片
        img = cv.imread(self.img_path)
        # 图片宽度
        img_x = img.shape[1]
        # 图片高度
        img_y = img.shape[0]
        # 分割的矩形区域
        rect = (100,100, 350, 850)
        # 背景模式,必须为1行,13x5列
        bgModel = np.zeros((1, 65), np.float64)
        # 前景模式,必须为1行,13x5列
        fgModel = np.zeros((1, 65), np.float64)
        # 图像掩模,取值有0,1,2,3
        mask = np.zeros(img.shape[:2], np.uint8)
        # grabCut处理,GC_INIT_WITH_RECT模式
        cv.grabCut(img, mask, rect, bgModel, fgModel, 4, cv.GC_INIT_WITH_RECT)
        # grabCut处理,GC_INIT_WITH_MASK模式
        # cv2.grabCut(img, mask, rect, bgModel, fgModel, 4, cv2.GC_INIT_WITH_MASK)
        # 将背景0,2设成0,其余设成1
        mask2 = np.where((mask==2) | (mask==0), 0, 1).astype('uint8')
        # 重新计算图像着色,对应元素相乘
        img = img*mask2[:, :, np.newaxis]
        cv.imshow("Result", img)


    def medui_blur(self):

        src=cv.imread(self.img_path)
        dst=cv.medianBlur(src,5)
        cv.imwrite("tempImg.jpg",dst)
        self.recommend_button_1.setIcon(QIcon('tempImg.jpg'))
        self.img_path="tempImg.jpg"
        #cv.imshow("on",dst)


       # self.recommend_button_1.setIcon(QtGui.QIcon("img/lenna.jpg"))
       # fname, _ = QFileDialog.getOpenFileName( '选择图片', 'c:\\', 'Image files(*.jpg *.gif *.png)')
        #self.img_path=fname
       # self.recommend_button_1.setIcon(QtGui.QIcon(fname)) # 设置按钮图标
       # self.recommend_button_1.setIconSize(QtCore.QSize(600,600)) # 设置图标大小
    def openImg(self):
        #print(self.recommend_button_1)
        fname,_ = QFileDialog.getOpenFileName(self,'选择图片', 'c:\\', 'Image files(*.jpg *.gif *.png)')
        self.img_path=fname
        self.recommend_button_1.setIcon(QIcon(fname)) # 设置按钮图标
        self.recommend_button_1.setIconSize(QSize(600,600)) # 设置图标大小

    def init_ui(self):
        #self.setFixedSize(960,700)
        self.showMaximized()
        self.main_widget = QWidget()  # 创建窗口主部件
        self.main_layout = QGridLayout()  # 创建主部件的网格布局
        self.main_widget.setLayout(self.main_layout)  # 设置窗口主部件布局为网格布局

        self.left_widget = QWidget()  # 创建左侧部件
        self.left_widget.setObjectName('left_widget')
        self.left_layout = QGridLayout()  # 创建左侧部件的网格布局层
        self.left_widget.setLayout(self.left_layout) # 设置左侧部件布局为网格

        self.right_widget = QWidget() # 创建右侧部件
        self.right_widget.setObjectName('right_widget')
        self.right_layout = QGridLayout()
        self.right_widget.setLayout(self.right_layout) # 设置右侧部件布局为网格

        self.main_layout.addWidget(self.left_widget,0,0,12,2) # 左侧部件在第0行第0列,占8行3列
        self.main_layout.addWidget(self.right_widget,0,2,12,10) # 右侧部件在第0行第3列,占8行9列
        self.setCentralWidget(self.main_widget) # 设置窗口主部件



        # 左边部件==================》
        self.left_close = QPushButton("") # 关闭按钮
        self.left_visit = QPushButton("") # 空白按钮
        self.left_mini = QPushButton("")  # 最小化按钮

        self.left_label_1 = QPushButton("文件操作")
        self.left_label_1.setObjectName('left_label')
        self.left_label_2 = QPushButton("编辑操作")
        self.left_label_2.setObjectName('left_label')
        self.left_label_3 = QPushButton("识图操作")
        self.left_label_3.setObjectName('left_label')

        self.left_button_1 = QPushButton(qtawesome.icon('fa.search',color='white'),"打开")
        self.left_button_1.setObjectName('left_button')
        self.left_button_1.clicked.connect(self.openImg)


        #打开操作
        self.left_button_2 = QPushButton(qtawesome.icon('fa.sellsy',color='white'),"保存")
        self.left_button_2.setObjectName('left_button')
        self.left_button_2.clicked.connect(self.saveFun)
        self.left_button_3 = QPushButton(qtawesome.icon('fa.film',color='white'),"退出")
        self.left_button_3.setObjectName('left_button')
        self.left_button_3.clicked.connect(QApplication.quit)
        self.left_button_4 = QPushButton(qtawesome.icon('fa.home',color='white'),"去噪")
        self.left_button_4.setObjectName('left_button')
        self.left_button_4.clicked.connect(self.medui_blur)

        self.left_button_5 = QPushButton(qtawesome.icon('fa.download',color='white'),"切割")
        self.left_button_5.setObjectName('left_button')
        self.left_button_5.clicked.connect(self.grab_cut)

        self.left_button_6 = QPushButton(qtawesome.icon('fa.heart',color='white'),"均衡化")
        self.left_button_6.setObjectName('left_button')
        self.left_button_6.clicked.connect(self.hist_equalization)

        self.left_button_7 = QPushButton(qtawesome.icon('fa.comment',color='white'),"人脸")
        self.left_button_7.setObjectName('left_button')
        #detect_face
        self.left_button_7.clicked.connect(self.detect_face)

        self.left_button_8 = QPushButton(qtawesome.icon('fa.star',color='white'),"数字")
        self.left_button_8.setObjectName('left_button')
        self.left_button_8.clicked.connect(self.recog_digit)

        self.left_button_9 = QPushButton(qtawesome.icon('fa.question',color='white'),"物体")
        self.left_button_9.setObjectName('left_button')
        #self.left_xxx = QPushButton(" ")

        #在这里,我们使用qtawesome这个第三方库来实现按钮中的Font Awesome字体图标的显示。然后将创建的按钮添加到左侧部件的网格布局层中:

        self.left_layout.addWidget(self.left_mini, 0, 0,1,1)
        self.left_layout.addWidget(self.left_close, 0, 2,1,1)
        self.left_layout.addWidget(self.left_visit, 0, 1, 1, 1)
        self.left_layout.addWidget(self.left_label_1,1,0,1,3)
        self.left_layout.addWidget(self.left_button_1, 2, 0,1,3)
        self.left_layout.addWidget(self.left_button_2, 3, 0,1,3)
        self.left_layout.addWidget(self.left_button_3, 4, 0,1,3)
        self.left_layout.addWidget(self.left_label_2, 5, 0,1,3)
        self.left_layout.addWidget(self.left_button_4, 6, 0,1,3)
        self.left_layout.addWidget(self.left_button_5, 7, 0,1,3)
        self.left_layout.addWidget(self.left_button_6, 8, 0,1,3)
        self.left_layout.addWidget(self.left_label_3, 9, 0,1,3)
        self.left_layout.addWidget(self.left_button_7, 10, 0,1,3)
        self.left_layout.addWidget(self.left_button_8, 11, 0,1,3)
        self.left_layout.addWidget(self.left_button_9, 12, 0, 1, 3)




        #右边部件===================================》
        self.right_bar_widget = QWidget() # 右侧顶部搜索框部件
        self.right_bar_layout = QGridLayout() # 右侧顶部搜索框网格布局
        self.right_bar_widget.setLayout(self.right_bar_layout)
        self.search_icon = QLabel(chr(0xf002) + ' '+'打开  ')
        self.search_icon.setFont(qtawesome.font('fa', 16))
        self.right_bar_widget_search_input = QLineEdit()
        self.right_bar_widget_search_input.setPlaceholderText("输入图片路经,回车加载图片或使用快捷键Ctrl+O")

        self.right_bar_layout.addWidget(self.search_icon,0,0,1,1)
        self.right_bar_layout.addWidget(self.right_bar_widget_search_input,0,1,1,8)

        self.right_layout.addWidget(self.right_bar_widget, 0, 0, 1, 9)

        #=================================>
       # self.right_recommend_label = QLabel("原始图片")
       # self.right_recommend_label.setObjectName('right_lable')

        self.right_recommend_widget = QWidget() # 推荐封面部件
        self.right_recommend_layout = QGridLayout() # 推荐封面网格布局
        self.right_recommend_widget.setLayout(self.right_recommend_layout)

        #self.src_img_label =QLabel("图片走丢了")

        self.recommend_button_1 = QToolButton()
        self.recommend_button_1.setStyleSheet("QToolButton{color:white; background-color:transparent;}")
        #self.recommend_button_1.setText("可馨HANM") # 设置按钮文本
        self.recommend_button_1.setIcon(QIcon('img/lenna.jpg')) # 设置按钮图标=====================================
        self.recommend_button_1.setIconSize(QSize(600,600)) # 设置图标大小
        #self.recommend_button_1.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) # 设置按钮形式为上图下文

        #self.right_recommend_layout.addWidget(self.src_img_label,0,0)
        self.right_recommend_layout.addWidget(self.recommend_button_1,0,0)

        #self.right_layout.addWidget(self.right_recommend_label, 1, 0, 1, 9)
        self.right_layout.addWidget(self.right_recommend_widget, 1, 0, 1, 9)


        #程序美化
        self.left_close.setFixedSize(15,15) # 设置关闭按钮的大小
        self.left_visit.setFixedSize(15, 15)  # 设置按钮大小
        self.left_mini.setFixedSize(15, 15) # 设置最小化按钮大小
        self.left_close.setStyleSheet('''QPushButton{background:#F76677;border-radius:5px;}QPushButton:hover{background:red;}''')
        self.left_visit.setStyleSheet('''QPushButton{background:#F7D674;border-radius:5px;}QPushButton:hover{background:yellow;}''')
        self.left_mini.setStyleSheet('''QPushButton{background:#6DDF6D;border-radius:5px;}QPushButton:hover{background:green;}''')

        #===================
        self.left_widget.setStyleSheet('''
        QPushButton{border:none;color:white;}
        QPushButton#left_label{
            border:none;
            border-bottom:1px solid white;
            font-size:18px;
            font-weight:700;
            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        }
        QPushButton#left_button:hover{border-left:4px solid red;font-weight:700;}

        QWidget#left_widget{
    background:gray;
    border-top:1px solid white;
    border-bottom:1px solid white;
    border-left:1px solid white;
    border-top-left-radius:10px;
    border-bottom-left-radius:10px;
}
    ''')

        self.right_bar_widget_search_input.setStyleSheet(
'''QLineEdit{
        border:1px solid gray;
        width:300px;
        border-radius:10px;
        padding:2px 4px;
}''')

        self.right_widget.setStyleSheet('''
    QWidget#right_widget{
        color:#232C51;
        background:white;
        border-top:1px solid darkGray;
        border-bottom:1px solid darkGray;
        border-right:1px solid darkGray;
        border-top-right-radius:10px;
        border-bottom-right-radius:10px;
    }
    QLabel#right_lable{
        border:none;
        font-size:16px;
        font-weight:700;
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    }
''')

        #设置透明化
        self.setWindowOpacity(0.99) # 设置窗口透明度
        self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明

        self.setWindowFlag(Qt.FramelessWindowHint) # 隐藏边框

        #省略了异步
        self.main_layout.setSpacing(0)



def quit():
    app.exit(0)


def main():
    app = QApplication(sys.argv)
    gui = MainUi()
    gui.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

在这里插入图片描述

还有一个是我自己写的

#coding=utf-8
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

#=========================图像处理模块的导入
import gray_equalization


class Example(QMainWindow):

    def __init__(self,parent=None):
        #必须
        super(Example, self).__init__(parent)
        layout=QGridLayout()
        self.label = QLabel()
        layout.addWidget(self.label)
        widget=QWidget()
        widget.setLayout(layout)

        #widget.autoFillBackground()
        widget.setGeometry(500, 500, 300, 350)
        widget.setMaximumWidth(1000)
        self.setCentralWidget(widget)
        self.initUI()


    def initUI(self):
        self.statusBar()  #创建状态栏(实例化状态栏对象)
       # self.setStatusTip(self,"haha")
        layout=QVBoxLayout()
        #文件============================================================================>
        menubar = self.menuBar()  # 创建菜单栏
        fileMenu = menubar.addMenu('&文件')   # 添加菜单
         #exitAct = QAction(QIcon('D:\\one.jpg'), '&Exit', self)  # 构造一个带有图标、一些文本和父对象的操作
        openAct = QAction('&打开...', self)  # 文本信息,&是可追加的意思.
        openAct.triggered.connect(self.openImg)  # 要触发的事件是:当鼠标悬停在菜单栏的时候,能显示当前状态。
        # QIcon('exit.png')用于加载图标
        openAct.setShortcut('Ctrl+O') # 设置交互的快捷键
        openAct.setStatusTip('状态提示信息') # 设置状态提示信息
        fileMenu.addAction(openAct)  # 设置交互动作
        save = QMenu('保存', self)  # 添加子菜单###################
        quit = QMenu('退出', self)
        fileMenu.addMenu(save)
        fileMenu.addMenu(quit)

       #编辑============================================================================>
        edit_menubar = self.menuBar()
        edit_menu = edit_menubar.addMenu('&编辑')
        edge_detection_Act = QAction('&边缘检测', self)
        hist_equalization = QMenu('直方图均衡化', self)
        hist_equalization_click=QAction(hist_equalization)
        hist_equalization.addAction(hist_equalization_click)
       # hist_equalization.add  .connect(self.on_click)
        hist_equalization_click.triggered.connect(self.gray_equalization)
        denoising = QMenu('去噪', self)
        img_cutting = QMenu('图像切割', self)
        edit_menu.addAction(edge_detection_Act)
        edit_menu.addMenu(hist_equalization)
        edit_menu.addMenu(denoising)
        edit_menu.addMenu(img_cutting)

       #识图================================================================================>
        recog_menubar = self.menuBar()
        recog_menu = recog_menubar.addMenu('&识图')
        object_Act = QAction('&物体识别', self)
        face_recog = QMenu('人脸检测', self)
        digit_recog = QMenu('数字识别', self)
        recog_menu.addAction(object_Act)
        recog_menu.addMenu(face_recog)
        recog_menu.addMenu(digit_recog)


       #菜单栏================================================================================>
        #self.setGeometry(200, 200, 500, 500)  # app应用的位置和窗口大小,9,9是屏幕最上角的位置
        self.showMaximized()
        self.setWindowTitle('修图识图')  # app的标题
        self.show()

    def openImg(self):
        fname, _ = QFileDialog.getOpenFileName(self, '选择图片', 'c:\\', 'Image files(*.jpg *.gif *.png)')
        self.img_path=fname

        self.label.setPixmap(QPixmap(fname))

    def gray_equalization(self):
       # print(self.img_path)
        gray_equalization.run( self.img_path)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())



在这里插入图片描述

代码大多参考如下:

用 Python 实现 LDA
https://blog.csdn.net/github_36299736/article/details/54966460
线性判别分析(LDA)
https://blog.csdn.net/liuweiyuxiang/article/details/78874106
Mnist数据集以及input_data.py的代码
https://blog.csdn.net/weixin_43159628/article/details/83241345
用Qt Designer来设计UI界面,并转化为python代码运行
https://blog.csdn.net/qq_38161040/article/details/85245112
python gui课程
https://zmister.com/archives/category/guidevelop/pyqt5_basic/page/2/
pyqt5官网
https://www.riverbankcomputing.com/static/Docs/PyQt5/module_index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值