最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python結合PyQt5打造一個高顏值的可視化獎狀生成器

 更新時間:2026年04月10日 11:35:50   作者:站大爺IP  
這篇文章主要為大家詳細介紹了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學習入門之區(qū)塊鏈詳解

    Python學習入門之區(qū)塊鏈詳解

    區(qū)塊鏈的基礎概念很簡單:一個分布式數據庫,存儲一個不斷加長的 list,list 中包含著許多有序的記錄。下面這篇文章主要給大家介紹了關于Python學習入門之區(qū)塊鏈的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Python中正則表達式妙用之以搜索電子郵件地址為例

    Python中正則表達式妙用之以搜索電子郵件地址為例

    這篇文章主要給大家介紹了關于Python中正則表達式妙用之以搜索電子郵件地址為例的相關資料,正則表達式經常被用到,而自己總是記不全,匯總一份完整的以備不時之需,需要的朋友可以參考下
    2024-05-05
  • Python ''takes exactly 1 argument (2 given)'' Python error

    Python ''takes exactly 1 argument (2 given)'' Python error

    這篇文章主要介紹了Python 'takes exactly 1 argument (2 given)' Python error的相關資料,需要的朋友可以參考下
    2016-12-12
  • 如何學習Python time模塊

    如何學習Python time模塊

    在本篇文章里小編給大家分享的是關于Python time模塊知識點及用法,需要的朋友們可以學習下。
    2020-06-06
  • 基于Python和MoviePy實現照片管理和視頻合成工具

    基于Python和MoviePy實現照片管理和視頻合成工具

    在這篇博客中,我們將詳細剖析一個基于 Python 的圖形界面應用程序,該程序使用 wxPython 構建用戶界面,并結合 MoviePy、Pillow 和 OpenCV 等庫實現照片管理和視頻合成功能,通過對代碼的逐部分分析,需要的朋友可以參考下
    2025-04-04
  • 僅利用30行Python代碼來展示X算法

    僅利用30行Python代碼來展示X算法

    這篇文章主要介紹了僅利用30行Python代碼來展示X算法,同時還有對算法實現的復雜度的說明,需要的朋友可以參考下
    2015-04-04
  • Matplotlib繪圖基礎之子圖詳解

    Matplotlib繪圖基礎之子圖詳解

    這篇文章主要為大家詳細介紹了Matplotlib繪制子圖的常用方式和技巧,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的可以了解一下
    2023-07-07
  • python二維鍵值數組生成轉json的例子

    python二維鍵值數組生成轉json的例子

    今天小編就為大家分享一篇python二維鍵值數組生成轉json的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 使用Python制作一個極簡四則運算解釋器

    使用Python制作一個極簡四則運算解釋器

    這篇文章主要介紹了使用Python制作一個極簡四則運算解釋器,在使用工具之前,至少也要了解工具的作用,需要的朋友可以參考下
    2023-04-04
  • Pandas統(tǒng)計重復的列里面的值方法

    Pandas統(tǒng)計重復的列里面的值方法

    今天小編就為大家分享一篇Pandas統(tǒng)計重復的列里面的值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01

最新評論

柘城县| 南宫市| 枣庄市| 宜州市| 怀来县| 百色市| 宝兴县| 嫩江县| 比如县| 桃园市| 蒲城县| 普兰县| 来宾市| 义乌市| 抚顺市| 龙胜| 桐梓县| 内江市| 滁州市| 天津市| 鲜城| 桑日县| 黄梅县| 锡林郭勒盟| 观塘区| 富宁县| 铜鼓县| 克拉玛依市| 石阡县| 肃宁县| 南充市| 安康市| 渑池县| 儋州市| 台湾省| 项城市| 光山县| 禹州市| 鹰潭市| 兴宁市| 贺州市|