GUI编程--PyQt5--综合案例1

需求分析

  1. 登录页面
    使用QFormLayout布局,实现如下登录页面
    在这里插入图片描述
  2. 项目首页
    使用pandas读取excel数据,并使用matplotlib 实现如下的圆饼图
    在这里插入图片描述

代码

  1. 创建自己的画布对象
# 创建基于PyQt5 的画布控件
import pandas as pd
# 导入特定的画布 for pyqt5
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtWidgets import QSizePolicy
# 导入图表类
from matplotlib.figure import Figure
# 绘制图标的工具
from matplotlib import pyplot as plt
from io import BytesIO
plt.rcParams['font.sans-serif'] = ["SimHei"]  # 显示中文


# 定义自己的画布控件
class MyCanvas(FigureCanvas):
    def __init__(self, parent, width, height, dpi=200):
        # 创建图表对象
        fig = Figure(figsize=(width, height), dpi=dpi)
        # 图表添加坐标轴
        # self.ax = fig.add_subplot(111)
        # 继承父类的初始化
        # super(MyCanvas, self).__init__(fig)
        FigureCanvas.__init__(self, fig)    # 初始化完成  具有self.figure 属性

        # 设置父控件 ,可以为QWidget
        self.setParent(parent)

        # 调整画布大小
        FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

        # self.plotPie()

    def plotPie(self, data, *args, **kwargs):
        # 图标添加坐标轴
        # fig, ax = plt.subplots()
        ax = self.figure.add_subplot(1, 1, 1)
        # 绘制圆饼图
        # https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.pie.html#matplotlib.axes.Axes.pie
        ax.pie(data, *args, **kwargs)
        ax.set_title('PyQt Matplotlib Example')
        ax.set_xlabel("x轴")
        ax.set_ylabel("y轴")
        # 画布
        self.draw()
  1. 功能页面实现

from PyQt5.QtGui import QIcon, QFont, QMovie, QPixmap, QPicture, QBrush, QCursor, QKeyEvent, QColor, QPalette, QTextCharFormat
from PyQt5 import QtGui
from PyQt5.QtCore import Qt, QDir, QUrl, QDate, QDateTime, QTime, QTimer, QThread, QThreadPool
from PyQt5.QtWidgets import QWidget, QFrame, QRadioButton, QErrorMessage, QCheckBox, QHBoxLayout, QVBoxLayout, QLayout, QGridLayout, QFormLayout, QStackedLayout, QMessageBox, QProgressDialog, QProgressBar, QLCDNumber, QLineEdit, QTextEdit, QMainWindow, QCalendarWidget, QDialog, QFontDialog, QColorDialog, QFileDialog, QInputDialog, QApplication, QLabel, QDesktopWidget, QPushButton
import sys


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        # 窗口标题
        self.setWindowTitle("laufing[*]")
        # 窗口图标
        pixmap = QPixmap("./imgs/dog.jpg").scaled(50, 50)
        icon = QIcon(pixmap)
        # icon.addPixmap(pixmap, QIcon.Normal, QIcon.Off)
        self.setWindowIcon(icon)

        # 设置宽高
        self.resize(500, 600)

        # 窗口居中
        desktop_geo = QDesktopWidget().geometry()
        width, height = desktop_geo.width(), desktop_geo.height()
        self.move(width / 2 - self.width() / 2, height / 2 - self.height() / 2)

        # 用户信息
        self.username = None
        self.pwd = None
        self.sex = None
        self.agree = None
		# 展示页面
        self.set_ui()
        
    def set_ui(self):
        # 展示登录页面
        self.login_page()

    def login_page(self):
        self.loginFrame = QFrame(self)
        self.loginFrame.setFrameShape(QFrame.Shape.Box)
        self.loginFrame.setFrameShadow(QFrame.Shadow.Sunken)

        # form 布局
        formLayout = QFormLayout()

        # 设置布局格式
        formLayout.setContentsMargins(5, 5, 5, 5)

        def checkLogin():
            self.username = userLe.text()
            self.pwd = pwdLe.text()
            self.agree = True if agreement.isChecked() else False
            self.sex = male.text() if male.isChecked() else female.text()

            print("获取用户信息", self.username, self.pwd, self.agree, self.sex)

            # 验证用户信息是否正确 忽略
            print("验证用户信息成功,跳转到首页...")
			# 登录成功后,页面切换
            self.loginFrame.setParent(None) # 不展示
			
			# 展示首页
            self.index()
            
        wel = QLabel("欢迎登录xxx")
        font = QFont("Arial", 24, 10)
        wel.setFont(font)  # 设置label 字体
        wel.setAlignment(Qt.AlignmentFlag.AlignCenter)
        # 添加子控件
        user = QLabel("用户名:")
        userLe = QLineEdit()
        # userLe.editingFinished.connect(getUsername)

        pwd = QLabel("密码:")
        pwdLe = QLineEdit()

        agreement = QCheckBox("同意协议")
		# 性别单选
        sexLabel = QLabel("性别:")
        male = QRadioButton("男")
        female = QRadioButton("女")
        hb = QHBoxLayout()  # 水平盒子布局
        hb.addWidget(male)
        hb.addWidget(female)

        login_btn = QPushButton("登录")
        login_btn.clicked.connect(checkLogin) # 信号与槽

        # form 布局 添加子控件
        formLayout.addRow(wel)
        formLayout.addRow(user, userLe)
        formLayout.addRow(pwd, pwdLe)
        formLayout.addRow(sexLabel, hb)
        formLayout.addRow(agreement)
        formLayout.addRow(login_btn)

        formLayout.setVerticalSpacing(30)
        formLayout.setHorizontalSpacing(5)
        formLayout.setRowWrapPolicy(QFormLayout.RowWrapPolicy.WrapLongRows)

        # 父控件 设置布局
        self.loginFrame.setLayout(formLayout)

        # 展示在父控件中
        self.loginFrame.setParent(self)

    def resizeEvent(self, a0: QtGui.QResizeEvent):
        # 控件展示时,才执行
        if hasattr(self, "loginFrame"):
            self.loginFrame.resize(self.width() * 0.8, self.height() * 0.8)
            self.loginFrame.move(self.width() * 0.1, self.height() * 0.1)

    # 首页
    def index(self):
        # 读取数据,并绘制圆饼图
        try:
            df = pd.read_excel("./imgs/data.xlsx", engine="xlrd")
            print("读取的数据:\n", df)
        except Exception as e:
            print(e.args)

        # 垂直盒子布局
        vb = QVBoxLayout()
        vb.setContentsMargins(10, 10, 10, 10)
        # 子控件
        welLabel = QLabel("欢迎来到主页")
        font = QFont()
        font.setFamily("Arial")
        font.setPointSize(24)
        font.setUnderline(True)
        welLabel.setFont(font)
        welLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)
        welLabel.setStyleSheet("color: red;")

        # 图表子控件
        figArea = QLabel()
        # 实例化 自己的画布控件,宽高不能太大
        myCanvas = MyCanvas(figArea, width=5, height=4, dpi=100)
        myCanvas.plotPie(df['count'], startangle=15, explode=(0, 0.1, 0), labels=df["label"], autopct="%s%%")
        myCanvas.move(0, 0)
        # 此时父控件并没有重新绘制,所以子控件 调用show  自己单独绘制
        myCanvas.show()

        # 布局添加子控件
        vb.addWidget(welLabel)
        vb.addWidget(figArea)
        vb.setStretchFactor(figArea, 1)
        # 父控件 添加布局
        self.setLayout(vb)


if __name__ == '__main__':
    import time
    # 窗口应用程序
    app = QApplication(sys.argv)

    window = Window()
    window.show()
	# 退出状态码
    status_code = app.exec_()
    sys.exit(status_code)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值