各种对话框及文件保存
# 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