需求分析
- 登录页面
使用QFormLayout布局,实现如下登录页面
- 项目首页
使用pandas读取excel数据,并使用matplotlib 实现如下的圆饼图
代码
- 创建自己的画布对象
import pandas as pd
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)
FigureCanvas.__init__(self, fig)
self.setParent(parent)
FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
def plotPie(self, data, *args, **kwargs):
ax = self.figure.add_subplot(1, 1, 1)
ax.pie(data, *args, **kwargs)
ax.set_title('PyQt Matplotlib Example')
ax.set_xlabel("x轴")
ax.set_ylabel("y轴")
self.draw()
- 功能页面实现
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)
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)
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)
wel.setAlignment(Qt.AlignmentFlag.AlignCenter)
user = QLabel("用户名:")
userLe = QLineEdit()
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)
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)
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)