当前位置: 代码网 > it编程>前端脚本>Python > Python结合PyQt5打造一个高颜值的可视化奖状生成器

Python结合PyQt5打造一个高颜值的可视化奖状生成器

2026年04月10日 Python 我要评论
​事情发生在上周五下午三点半。钉钉群里,领导@了我:“小张,下周公司年会,需要批量制作优秀员工奖状,大概50张,每张名字和奖项不同。你想想办法,周一之前搞定。”我看了眼日历&m

​事情发生在上周五下午三点半。

钉钉群里,领导@了我:“小张,下周公司年会,需要批量制作优秀员工奖状,大概50张,每张名字和奖项不同。你想想办法,周一之前搞定。”

我看了眼日历——周五下午三点半。这意味着我要在周末两天内,手动做50张奖状?打开word、改名字、改奖项、调整排版、导出图片……光是想想手就酸了。

正当我准备打开ps开始苦哈哈地复制粘贴时,脑子里突然闪过一个念头:能不能写个小程序,自动生成?

作为python写了两年多的程序员,我第一时间想到的是pyqt5。这个框架我平时用来写一些小工具,上手快,界面也能做得挺好看。关键是——两小时能搞定。

于是关掉ps,打开pycharm,开始动手。

第一步:先把样子搭出来

写gui程序,我习惯从界面开始。脑子里先有个画面:用户输入姓名、奖项名称,点一下按钮,一张好看的奖状就出来了。

pyqt5里有个东西叫qt designer,可视化拖拽布局,像搭积木一样。但我更喜欢手写代码——控制感更强,后期改样式也方便。

界面大概长这样:上面是个标题,中间放几个输入框(姓名、奖项名称、获奖日期),下面一个“生成奖状”按钮,右侧留一块区域用来预览奖状。

核心代码其实不复杂:

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)
        
        # 右侧预览区
        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水平布局,左右各放一块区域。左边是表单,右边是预览框。qlineedit用来输入文本,qdateedit用来选日期,qpushbutton就是那个生成按钮。

有个细节: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;
        }
    """)

样式表能做到的远不止这些。边框阴影、渐变背景、圆角矩形,统统可以。给奖状加个烫金边框:

# 预览区域的样式
self.preview_area.setstylesheet("""
    border: 3px solid #d4af37;
    border-radius: 15px;
    background: white;
""")

第三步:把文字“画”到奖状上

有了界面,接下来是最关键的部分——动态生成奖状图片

pyqt5里有个qpainter,专门用来绘制图形和文字。思路是这样的:先创建一张空白图片,然后用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, "提示", "请填写完整信息")
        return
    
    # 创建空白图片
    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()
    
    # 显示到预览区
    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方法需要在矩形区域内定位文字。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)
    
    # 创建保存目录
    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张奖状,点一下按钮,十几秒全部搞定。

第五步:细节打磨,体验拉满

工具能用和好用之间,差的就是这些细节。

实时预览:用户输入姓名和奖项后,点击生成马上能看到效果,不满意随时调整。

键盘快捷键:加上回车键直接生成。

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, "提示", "请填写完整信息")
    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检测系统可用字体,或者把字体文件打包进程序。

图片保存格式。png格式清晰度最好,体积也小。qimage.save()默认保存为png,也可以指定jpeg。

打包成exe给别人用。用pyinstaller一行命令搞定:pyinstaller --onefile --windowed award_generator.py。同事不需要装python,双击就能用。

写在最后

有人说,写这种小工具是“重复造轮子”。我不这么看。

市面上确实有成型的奖状生成软件,但它们要么收费,要么操作复杂,要么模板固定不能满足需求。自己写一个,完全按自己的工作流来设计,想加什么功能随时加。

这次是奖状生成器,下次可能是合同生成器、工牌生成器、标签打印器……掌握了pyqt5这套东西,能解决工作中各种“批量生成”类的需求

代码写完了,丢到github上。需要的同事自取,有问题找我。这就是程序员的“授人以渔”。

两小时换未来每年省下的几个小时,这笔账,怎么算都不亏。

​以上就是python结合pyqt5打造一个高颜值的可视化奖状生成器的详细内容,更多关于python奖状生成器的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com