第五天,用Qt设计完ui生成.py文件,创建main.py文件编写组件代码。
使用PyUIC工具进行转换,ui生成.py文件。
创建主程序文件
import sys
import dialog # 自己设计的界面文件
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
if __name__ == '__main__':
"""
程序入口
"""
# 创建一个应用程序对象
app = QApplication(sys.argv)
# 创建窗口对象
Dialog = QDialog()
# 根据界面文件来生成一个管理的对象
ui = dialog.Ui_Dialog()
# 初始化dialog.py中设计的组件对象
ui.setupUi(Dialog)
# 展示窗口
Dialog.show()
# 让主程序进入事件循环
sys.exit(app.exec_())
增加一些点击效果
import sys
import dialog
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
def click_success():
"""
点击按钮后触发的函数
"""
print("点击了按钮")
# 在UI上谈个小窗
# 参数1:送一个组件对象
# 参数2:小窗标题
# 参数3:显示文字
QMessageBox.information(ui.pushButton, "实训课程", "哈哈哈哈哈,终于触发了!")
if __name__ == '__main__':
"""
程序入口
"""
app = QApplication(sys.argv)
Dialog = QDialog()
ui = dialog.Ui_Dialog()
ui.setupUi(Dialog)
# 后续所有的组件操作代码请放在此后
# 信号槽:让组件设置触发效果
# pushButton是组件对象的名称
# click_success是触发函数的名称
ui.pushButton.clicked.connect(click_success)
Dialog.show()
sys.exit(app.exec_())
获取用户输入代码
import sys
import dialog
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
def click_success():
"""
点击按钮后触发的函数
"""
print("点击了按钮")
# 获取用户在单行文本输入框中的输入内容
keyword = ui.lineEdit.text()
# 如果不输入,提示输入
if keyword == "":
QMessageBox.information(ui.pushButton, "提示", "请输入要分析的关键字")
return
# 获取输入的数量
count = ui.spinBox.value()
# TODO 执行之前人脸数据分析代码,可能会出现假死问题
print(keyword, count)
if __name__ == '__main__':
"""
程序入口
"""
app = QApplication(sys.argv)
Dialog = QDialog()
ui = dialog.Ui_Dialog()
ui.setupUi(Dialog)
# 后续所有的组件操作代码请放在此后
ui.pushButton.clicked.connect(click_success)
Dialog.show()
sys.exit(app.exec_())
完整代码
import sys
import dialog
import shutil # 用于清空文件夹
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from icrawler.builtin import BingImageCrawler
from aip import AipFace
import base64
import time # 用于延迟操作
import os # 用于文件操作
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType # 导入主题
# 颜值统计
count_class_1 = 0
count_class_2 = 0
count_class_3 = 0
count_class_4 = 0
count_class_5 = 0
count_class_6 = 0
count_class_7 = 0
count_class_8 = 0
count_class_9 = 0
count_class_10 = 0
count_class_error = 0
def clear_data():
"""
清空之前的统计数据
:return:
"""
global count_class_1, count_class_2, count_class_3, count_class_4, count_class_5, count_class_6, count_class_7, \
count_class_8, count_class_9, count_class_10, count_class_error
count_class_1 = 0
count_class_2 = 0
count_class_3 = 0
count_class_4 = 0
count_class_5 = 0
count_class_6 = 0
count_class_7 = 0
count_class_8 = 0
count_class_9 = 0
count_class_10 = 0
count_class_error = 0
def bing_image_crawler(keyword, max_num):
"""
基于bing搜索引擎爬取图片
:param keyword: 关键字
:param max_num: 数量
"""
# 删除之前bing文件夹,以保证连续可分析
if os.path.exists('bing'):
shutil.rmtree('bing')
bing_crawler = BingImageCrawler(
feeder_threads=2,
parser_threads=4,
downloader_threads=8,
storage={'root_dir': 'bing'})
filters = dict(size='medium')
bing_crawler.crawl(keyword=keyword,
filters=filters,
max_num=max_num)
""" 你的 APPID AK SK """
APP_ID = '16966840'
API_KEY = 'B0e6QoxUB0gwQxxzWT6fCgMU'
SECRET_KEY = 'rGQji0R0X76e4CP9rbcdPbcNRdS6EwC9'
def img2base64(path):
"""
把图片文件转换为基于base64的字符串,以便用于网络传播
:param path: 图片的路径
:return: 转换后的结果
"""
file = open(path, 'rb')
data = file.read()
base = base64.b64encode(data)
base = base.decode('utf-8')
file.close()
return base
def detect_face(img_path):
"""
人脸检测
:param img_path: 人脸检测的图片路径
:return: 百度服务器返回的人脸检测数据
"""
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
options = {"face_field": "age,beauty"}
image = img2base64(img_path)
return client.detect(image, "BASE64", options)
def parse_data(data):
"""
解析服务器返回的数据,并提取颜值分数,根据颜值分数进行等级划分
:param data: 服务器返回的原始结果数据
:return: 颜值等级
"""
# 颜值半秒,控制QPS
time.sleep(0.5)
if data['error_code'] != 0:
print("识别有问题", data)
# 计数+1
global count_class_error
count_class_error += 1
return -1 # 访问有问题
beauty = data['result']['face_list'][0]['beauty']
if beauty >= 90:
# 计数+1
global count_class_10
count_class_10 += 1
return 10
elif beauty >= 85:
# 计数+1
global count_class_9
count_class_9 += 1
return 9
elif beauty >= 75:
# 计数+1
global count_class_8
count_class_8 += 1
return 8
elif beauty >= 65:
# 计数+1
global count_class_7
count_class_7 += 1
return 7
elif beauty >= 55:
# 计数+1
global count_class_6
count_class_6 += 1
return 6
elif beauty >= 45:
# 计数+1
global count_class_5
count_class_5 += 1
return 5
elif beauty >= 35:
# 计数+1
global count_class_4
count_class_4 += 1
return 4
elif beauty >= 25:
# 计数+1
global count_class_3
count_class_3 += 1
return 3
elif beauty >= 15:
# 计数+1
global count_class_2
count_class_2 += 1
return 2
elif beauty >= 5:
# 计数+1
global count_class_1
count_class_1 += 1
return 1
else:
# 计数+1
count_class_error += 1
return -1 # 未知情况
def classify():
"""
【了解】本地磁盘中对各种颜值等级的图片进行分类
:return:无
"""
root_dir = 'bing'
# 列举所有目录下的文件和文件夹
file_list = os.listdir(root_dir)
# 遍历所有文件和文件夹
for i in range(0, len(file_list)):
# 拼装出文件路径
path = root_dir + '/' + file_list[i]
# 如果是文件
if os.path.isfile(path):
# 人脸识别获得其颜值等级
beauty = parse_data(detect_face(path))
# 按照颜值来创建文件夹,拼接出文件夹的路径
dic = root_dir + '/' + str(beauty) + '/'
# 如果识别有问题
if beauty == -1:
dic = 'bing/未识别/'
# 如果文件夹不存在,就新建一个
if not os.path.exists(dic):
os.makedirs(dic)
# 移动图片到等级文件夹中
# 参数1:源文件的路径
# 参数2:新文件的路径
os.rename(path, dic + file_list[i])
def draw_chart():
bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
bar.add_xaxis(["未识别", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"])
# 增加y轴
bar.add_yaxis("", [count_class_error,
count_class_1,
count_class_2,
count_class_3,
count_class_4,
count_class_5,
count_class_6,
count_class_7,
count_class_8,
count_class_9,
count_class_10])
bar.set_global_opts(title_opts=opts.TitleOpts(title="颜值统计图"))
bar.render()
def click_success():
"""
点击按钮后触发的函数
"""
print("点击了按钮")
# 获取用户在单行文本输入框中的输入内容
keyword = ui.lineEdit.text()
if keyword == "":
QMessageBox.information(ui.pushButton, "提示", "请输入要分析的关键字")
return
max_num = ui.spinBox.value()
# TODO 执行之前人脸数据分析代码,可能会出现假死问题
# 清空统计数据
clear_data()
# 爬取
bing_image_crawler(keyword, max_num)
print("人脸识别分类中......")
# 分类(包括人脸识别和解析)
classify()
# 画图
draw_chart()
print("程序执行完成")
if __name__ == '__main__':
"""
程序入口
"""
app = QApplication(sys.argv)
Dialog = QDialog()
ui = dialog.Ui_Dialog()
ui.setupUi(Dialog)
# 后续所有的组件操作代码请放在此后
ui.pushButton.clicked.connect(click_success)
Dialog.show()
sys.exit(app.exec_())
图形界面
运行效果
点击开始即可获得图片、数据分析、及统计图(程序运行较慢)。