Python結合PyQt5打造一個高顏值的可視化獎狀生成器
?事情發(fā)生在上周五下午三點半。
釘釘群里,領導@了我:“小張,下周公司年會,需要批量制作優(yōu)秀員工獎狀,大概50張,每張名字和獎項不同。你想想辦法,周一之前搞定。”
我看了眼日歷——周五下午三點半。這意味著我要在周末兩天內,手動做50張獎狀?打開Word、改名字、改獎項、調整排版、導出圖片……光是想想手就酸了。
正當我準備打開PS開始苦哈哈地復制粘貼時,腦子里突然閃過一個念頭:能不能寫個小程序,自動生成?
作為Python寫了兩年多的程序員,我第一時間想到的是PyQt5。這個框架我平時用來寫一些小工具,上手快,界面也能做得挺好看。關鍵是——兩小時能搞定。
于是關掉PS,打開PyCharm,開始動手。
第一步:先把樣子搭出來
寫GUI程序,我習慣從界面開始。腦子里先有個畫面:用戶輸入姓名、獎項名稱,點一下按鈕,一張好看的獎狀就出來了。
PyQt5里有個東西叫Qt Designer,可視化拖拽布局,像搭積木一樣。但我更喜歡手寫代碼——控制感更強,后期改樣式也方便。
界面大概長這樣:上面是個標題,中間放幾個輸入框(姓名、獎項名稱、獲獎日期),下面一個“生成獎狀”按鈕,右側留一塊區(qū)域用來預覽獎狀。
核心代碼其實不復雜:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class AwardGenerator(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("獎狀生成器")
self.setFixedSize(900, 600)
# 中央控件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 主布局
main_layout = QHBoxLayout(central_widget)
# 左側控制面板
left_panel = QWidget()
left_layout = QFormLayout(left_panel)
self.name_input = QLineEdit()
self.award_input = QLineEdit()
self.date_input = QDateEdit()
self.date_input.setDate(QDate.currentDate())
left_layout.addRow("獲獎人姓名:", self.name_input)
left_layout.addRow("獎項名稱:", self.award_input)
left_layout.addRow("獲獎日期:", self.date_input)
self.generate_btn = QPushButton("生成獎狀")
self.generate_btn.clicked.connect(self.generate_certificate)
left_layout.addRow(self.generate_btn)
# 右側預覽區(qū)
self.preview_area = QLabel()
self.preview_area.setFixedSize(500, 400)
self.preview_area.setStyleSheet("border: 1px solid #ccc; background: white;")
self.preview_area.setAlignment(Qt.AlignCenter)
main_layout.addWidget(left_panel)
main_layout.addWidget(self.preview_area)
這里用到了QHBoxLayout水平布局,左右各放一塊區(qū)域。左邊是表單,右邊是預覽框。QLineEdit用來輸入文本,QDateEdit用來選日期,QPushButton就是那個生成按鈕。
有個細節(jié):self.generate_btn.clicked.connect(self.generate_certificate)這行代碼就是PyQt5的核心機制——信號與槽。說白了就是:按鈕被點擊時,自動調用generate_certificate這個函數。
第二步:讓獎狀真正“好看”起來
光有框架不行,獎狀得長得像獎狀。PyQt5支持樣式表,寫法跟CSS幾乎一樣。
我想要的效果:紅金色調,邊框華麗,文字有質感。
def setup_styles(self):
# 主窗口背景
self.setStyleSheet("""
QMainWindow {
background-color: #f5f0e8;
}
QPushButton {
background-color: #c0392b;
color: white;
border: none;
padding: 8px 15px;
border-radius: 5px;
font-size: 14px;
}
QPushButton:hover {
background-color: #e74c3c;
}
QLineEdit, QDateEdit {
padding: 5px;
border: 1px solid #ddd;
border-radius: 3px;
}
""")
樣式表能做到的遠不止這些。邊框陰影、漸變背景、圓角矩形,統(tǒng)統(tǒng)可以。給獎狀加個燙金邊框:
# 預覽區(qū)域的樣式
self.preview_area.setStyleSheet("""
border: 3px solid #d4af37;
border-radius: 15px;
background: white;
""")
第三步:把文字“畫”到獎狀上
有了界面,接下來是最關鍵的部分——動態(tài)生成獎狀圖片。
PyQt5里有個QPainter,專門用來繪制圖形和文字。思路是這樣的:先創(chuàng)建一張空白圖片,然后用QPainter往上面寫文字。
def generate_certificate(self):
# 獲取用戶輸入
name = self.name_input.text()
award = self.award_input.text()
date = self.date_input.date().toString("yyyy年MM月dd日")
if not name or not award:
QMessageBox.warning(self, "提示", "請?zhí)顚懲暾畔?)
return
# 創(chuàng)建空白圖片
image = QImage(800, 600, QImage.Format_ARGB32)
image.fill(Qt.white)
painter = QPainter(image)
painter.setRenderHint(QPainter.Antialiasing)
# 繪制金色邊框
pen = QPen(QColor(212, 175, 55))
pen.setWidth(8)
painter.setPen(pen)
painter.drawRect(20, 20, 760, 560)
# 繪制裝飾花紋(簡單版:四個角加圓點)
painter.setBrush(QBrush(QColor(212, 175, 55)))
for x, y in [(30, 30), (770, 30), (30, 570), (770, 570)]:
painter.drawEllipse(x-5, y-5, 10, 10)
# 設置標題字體
title_font = QFont("華文行書", 48, QFont.Bold)
painter.setFont(title_font)
painter.drawText(image.rect(), Qt.AlignTop | Qt.AlignHCenter, "榮譽證書")
# 設置正文字體
text_font = QFont("微軟雅黑", 16)
painter.setFont(text_font)
# 繪制正文
text = f"茲證明 {name} 同志:"
painter.drawText(image.rect().adjusted(0, 120, 0, 0),
Qt.AlignHCenter, text)
award_text = f"榮獲{2025}年度 “{award}” 榮譽稱號"
painter.drawText(image.rect().adjusted(0, 180, 0, 0),
Qt.AlignHCenter, award_text)
# 特此表彰,以資鼓勵
painter.drawText(image.rect().adjusted(0, 280, 0, 0),
Qt.AlignHCenter, "特此表彰,以資鼓勵")
# 落款
painter.drawText(image.rect().adjusted(-100, 450, 0, 0),
Qt.AlignRight, f"某某科技有限公司\n{date}")
painter.end()
# 顯示到預覽區(qū)
pixmap = QPixmap.fromImage(image)
scaled_pixmap = pixmap.scaled(self.preview_area.size(),
Qt.KeepAspectRatio,
Qt.SmoothTransformation)
self.preview_area.setPixmap(scaled_pixmap)
# 保存圖片
self.current_image = image
這段代碼里用到了幾個關鍵東西:
QPainter是繪圖的核心,所有的文字、線條、形狀都靠它畫出來。QFont用來設置字體和大小,為了讓獎狀有正式感,標題用了華文行書,正文用微軟雅黑。
drawText方法需要在矩形區(qū)域內定位文字。Qt.AlignHCenter表示水平居中,配合image.rect()調整上下偏移量,就能把文字擺到想要的位置。
顏色方面,金色邊框用RGB(212,175,55),這是標準的燙金色。邊框寬度設8像素,畫出來有厚重感。
第四步:加上批量生成,效率直接起飛
單張生成已經夠用,但領導要50張。再加個功能:讀取Excel批量生成。
def batch_generate(self):
# 選擇Excel文件
file_path, _ = QFileDialog.getOpenFileName(
self, "選擇Excel文件", "", "Excel文件(*.xlsx *.xls)"
)
if not file_path:
return
# 讀取數據
import pandas as pd
df = pd.read_excel(file_path)
# 創(chuàng)建保存目錄
output_dir = QFileDialog.getExistingDirectory(self, "選擇保存目錄")
if not output_dir:
return
# 批量生成
for idx, row in df.iterrows():
name = row['姓名']
award = row['獎項']
date = row.get('日期', QDate.currentDate().toString("yyyy-MM-dd"))
# 調用生成函數
image = self.create_certificate_image(name, award, date)
image.save(f"{output_dir}/{name}_獎狀.png")
QMessageBox.information(self, "完成", f"已生成{len(df)}張獎狀")
QFileDialog是PyQt5的標準文件選擇對話框,讓用戶選Excel文件和保存位置。pandas負責讀取數據,遍歷每一行調用之前寫好的生成函數。
50張獎狀,點一下按鈕,十幾秒全部搞定。
第五步:細節(jié)打磨,體驗拉滿
工具能用和好用之間,差的就是這些細節(jié)。
實時預覽:用戶輸入姓名和獎項后,點擊生成馬上能看到效果,不滿意隨時調整。
鍵盤快捷鍵:加上回車鍵直接生成。
def keyPressEvent(self, event):
if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
self.generate_certificate()
錯誤處理:沒填名字就點生成?彈個提示框,別讓程序崩潰。
if not name or not award:
QMessageBox.warning(self, "提示", "請?zhí)顚懲暾畔?)
return
進度提示:批量生成時顯示進度條,讓用戶知道還要等多久。
progress = QProgressDialog("正在生成獎狀...", "取消", 0, total, self)
for i, row in df.iterrows():
if progress.wasCanceled():
break
progress.setValue(i)
# 生成獎狀...
最終效果:兩小時交差,領導說“不錯”
周六上午開始寫,午飯前搞定。周一給領導演示:輸入“張三”、“最佳員工”,點一下按鈕,一張燙金邊框、排版精美的獎狀出現在屏幕上。
批量生成50張,選個文件夾,十幾秒全部輸出。
領導看了說:“這效率可以啊,以后每年都能用。”
我笑了笑沒說話,心想:這就是程序員的快樂——把重復勞動交給代碼,把時間留給自己。
如果你想自己做,這里有幾個小建議
樣式表不用背,現查現用。想要什么效果,搜“PyQt5 QPushButton樣式”就行。漸變色、陰影、圓角,網上大把例子。
布局別用絕對坐標。setGeometry(x, y, w, h)寫起來簡單,換個屏幕就亂套。用QVBoxLayout、QHBoxLayout、QGridLayout這些布局管理器,窗口大小變了也能自動適應。
字體兼容性問題。Windows上用“華文行書”、“微軟雅黑”沒問題,Mac或Linux上可能找不到這些字體。可以用QFontDatabase檢測系統(tǒng)可用字體,或者把字體文件打包進程序。
圖片保存格式。PNG格式清晰度最好,體積也小。QImage.save()默認保存為PNG,也可以指定JPEG。
打包成exe給別人用。用PyInstaller一行命令搞定:pyinstaller --onefile --windowed award_generator.py。同事不需要裝Python,雙擊就能用。
寫在最后
有人說,寫這種小工具是“重復造輪子”。我不這么看。
市面上確實有成型的獎狀生成軟件,但它們要么收費,要么操作復雜,要么模板固定不能滿足需求。自己寫一個,完全按自己的工作流來設計,想加什么功能隨時加。
這次是獎狀生成器,下次可能是合同生成器、工牌生成器、標簽打印器……掌握了PyQt5這套東西,能解決工作中各種“批量生成”類的需求。
代碼寫完了,丟到GitHub上。需要的同事自取,有問題找我。這就是程序員的“授人以漁”。
兩小時換未來每年省下的幾個小時,這筆賬,怎么算都不虧。
?以上就是Python結合PyQt5打造一個高顏值的可視化獎狀生成器的詳細內容,更多關于Python獎狀生成器的資料請關注腳本之家其它相關文章!
相關文章
Python ''takes exactly 1 argument (2 given)'' Python error
這篇文章主要介紹了Python 'takes exactly 1 argument (2 given)' Python error的相關資料,需要的朋友可以參考下2016-12-12

