实训日记五 完善ui组件代码

第五天,用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_())

图形界面

在这里插入图片描述

运行效果

在这里插入图片描述
点击开始即可获得图片、数据分析、及统计图(程序运行较慢)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值