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

Python結(jié)合PyQt5打造一個(gè)高顏值的可視化獎(jiǎng)狀生成器

 更新時(shí)間:2026年04月10日 11:35:50   作者:站大爺IP  
這篇文章主要為大家詳細(xì)介紹了Python如何結(jié)合PyQt5打造一個(gè)高顏值的可視化獎(jiǎng)狀生成器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

?事情發(fā)生在上周五下午三點(diǎn)半。

釘釘群里,領(lǐng)導(dǎo)@了我:“小張,下周公司年會(huì),需要批量制作優(yōu)秀員工獎(jiǎng)狀,大概50張,每張名字和獎(jiǎng)項(xiàng)不同。你想想辦法,周一之前搞定。”

我看了眼日歷——周五下午三點(diǎn)半。這意味著我要在周末兩天內(nèi),手動(dòng)做50張獎(jiǎng)狀?打開(kāi)Word、改名字、改獎(jiǎng)項(xiàng)、調(diào)整排版、導(dǎo)出圖片……光是想想手就酸了。

正當(dāng)我準(zhǔn)備打開(kāi)PS開(kāi)始苦哈哈地復(fù)制粘貼時(shí),腦子里突然閃過(guò)一個(gè)念頭:能不能寫(xiě)個(gè)小程序,自動(dòng)生成?

作為Python寫(xiě)了兩年多的程序員,我第一時(shí)間想到的是PyQt5。這個(gè)框架我平時(shí)用來(lái)寫(xiě)一些小工具,上手快,界面也能做得挺好看。關(guān)鍵是——兩小時(shí)能搞定。

于是關(guān)掉PS,打開(kāi)PyCharm,開(kāi)始動(dòng)手。

第一步:先把樣子搭出來(lái)

寫(xiě)GUI程序,我習(xí)慣從界面開(kāi)始。腦子里先有個(gè)畫(huà)面:用戶(hù)輸入姓名、獎(jiǎng)項(xiàng)名稱(chēng),點(diǎn)一下按鈕,一張好看的獎(jiǎng)狀就出來(lái)了。

PyQt5里有個(gè)東西叫Qt Designer,可視化拖拽布局,像搭積木一樣。但我更喜歡手寫(xiě)代碼——控制感更強(qiáng),后期改樣式也方便。

界面大概長(zhǎng)這樣:上面是個(gè)標(biāo)題,中間放幾個(gè)輸入框(姓名、獎(jiǎng)項(xiàng)名稱(chēng)、獲獎(jiǎng)日期),下面一個(gè)“生成獎(jiǎng)狀”按鈕,右側(cè)留一塊區(qū)域用來(lái)預(yù)覽獎(jiǎng)狀。

核心代碼其實(shí)不復(fù)雜:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class AwardGenerator(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("獎(jiǎng)狀生成器")
        self.setFixedSize(900, 600)
        
        # 中央控件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        
        # 主布局
        main_layout = QHBoxLayout(central_widget)
        
        # 左側(cè)控制面板
        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("獲獎(jiǎng)人姓名:", self.name_input)
        left_layout.addRow("獎(jiǎng)項(xiàng)名稱(chēng):", self.award_input)
        left_layout.addRow("獲獎(jiǎng)日期:", self.date_input)
        
        self.generate_btn = QPushButton("生成獎(jiǎng)狀")
        self.generate_btn.clicked.connect(self.generate_certificate)
        left_layout.addRow(self.generate_btn)
        
        # 右側(cè)預(yù)覽區(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ū)域。左邊是表單,右邊是預(yù)覽框。QLineEdit用來(lái)輸入文本,QDateEdit用來(lái)選日期,QPushButton就是那個(gè)生成按鈕。

有個(gè)細(xì)節(jié):self.generate_btn.clicked.connect(self.generate_certificate)這行代碼就是PyQt5的核心機(jī)制——信號(hào)與槽。說(shuō)白了就是:按鈕被點(diǎn)擊時(shí),自動(dòng)調(diào)用generate_certificate這個(gè)函數(shù)。

第二步:讓獎(jiǎng)狀真正“好看”起來(lái)

光有框架不行,獎(jiǎng)狀得長(zhǎng)得像獎(jiǎng)狀。PyQt5支持樣式表,寫(xiě)法跟CSS幾乎一樣。

我想要的效果:紅金色調(diào),邊框華麗,文字有質(zhì)感。

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;
        }
    """)

樣式表能做到的遠(yuǎn)不止這些。邊框陰影、漸變背景、圓角矩形,統(tǒng)統(tǒng)可以。給獎(jiǎng)狀加個(gè)燙金邊框:

# 預(yù)覽區(qū)域的樣式
self.preview_area.setStyleSheet("""
    border: 3px solid #d4af37;
    border-radius: 15px;
    background: white;
""")

第三步:把文字“畫(huà)”到獎(jiǎng)狀上

有了界面,接下來(lái)是最關(guān)鍵的部分——動(dòng)態(tài)生成獎(jiǎng)狀圖片。

PyQt5里有個(gè)QPainter,專(zhuān)門(mén)用來(lái)繪制圖形和文字。思路是這樣的:先創(chuàng)建一張空白圖片,然后用QPainter往上面寫(xiě)文字。

def generate_certificate(self):
    # 獲取用戶(hù)輸入
    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, "提示", "請(qǐng)?zhí)顚?xiě)完整信息")
        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)
    
    # 繪制裝飾花紋(簡(jiǎn)單版:四個(gè)角加圓點(diǎn))
    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)
    
    # 設(shè)置標(biāo)題字體
    title_font = QFont("華文行書(shū)", 48, QFont.Bold)
    painter.setFont(title_font)
    painter.drawText(image.rect(), Qt.AlignTop | Qt.AlignHCenter, "榮譽(yù)證書(shū)")
    
    # 設(shè)置正文字體
    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}” 榮譽(yù)稱(chēng)號(hào)"
    painter.drawText(image.rect().adjusted(0, 180, 0, 0), 
                     Qt.AlignHCenter, award_text)
    
    # 特此表彰,以資鼓勵(lì)
    painter.drawText(image.rect().adjusted(0, 280, 0, 0), 
                     Qt.AlignHCenter, "特此表彰,以資鼓勵(lì)")
    
    # 落款
    painter.drawText(image.rect().adjusted(-100, 450, 0, 0), 
                     Qt.AlignRight, f"某某科技有限公司\n{date}")
    
    painter.end()
    
    # 顯示到預(yù)覽區(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

這段代碼里用到了幾個(gè)關(guān)鍵東西:

QPainter是繪圖的核心,所有的文字、線(xiàn)條、形狀都靠它畫(huà)出來(lái)。QFont用來(lái)設(shè)置字體和大小,為了讓獎(jiǎng)狀有正式感,標(biāo)題用了華文行書(shū),正文用微軟雅黑。

drawText方法需要在矩形區(qū)域內(nèi)定位文字。Qt.AlignHCenter表示水平居中,配合image.rect()調(diào)整上下偏移量,就能把文字?jǐn)[到想要的位置。

顏色方面,金色邊框用RGB(212,175,55),這是標(biāo)準(zhǔn)的燙金色。邊框?qū)挾仍O(shè)8像素,畫(huà)出來(lái)有厚重感。

第四步:加上批量生成,效率直接起飛

單張生成已經(jīng)夠用,但領(lǐng)導(dǎo)要50張。再加個(gè)功能:讀取Excel批量生成。

def batch_generate(self):
    # 選擇Excel文件
    file_path, _ = QFileDialog.getOpenFileName(
        self, "選擇Excel文件", "", "Excel文件(*.xlsx *.xls)"
    )
    if not file_path:
        return
    
    # 讀取數(shù)據(jù)
    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['獎(jiǎng)項(xiàng)']
        date = row.get('日期', QDate.currentDate().toString("yyyy-MM-dd"))
        
        # 調(diào)用生成函數(shù)
        image = self.create_certificate_image(name, award, date)
        image.save(f"{output_dir}/{name}_獎(jiǎng)狀.png")
    
    QMessageBox.information(self, "完成", f"已生成{len(df)}張獎(jiǎng)狀")

QFileDialog是PyQt5的標(biāo)準(zhǔn)文件選擇對(duì)話(huà)框,讓用戶(hù)選Excel文件和保存位置。pandas負(fù)責(zé)讀取數(shù)據(jù),遍歷每一行調(diào)用之前寫(xiě)好的生成函數(shù)。

50張獎(jiǎng)狀,點(diǎn)一下按鈕,十幾秒全部搞定。

第五步:細(xì)節(jié)打磨,體驗(yàn)拉滿(mǎn)

工具能用和好用之間,差的就是這些細(xì)節(jié)。

實(shí)時(shí)預(yù)覽:用戶(hù)輸入姓名和獎(jiǎng)項(xiàng)后,點(diǎn)擊生成馬上能看到效果,不滿(mǎn)意隨時(shí)調(diào)整。

鍵盤(pán)快捷鍵:加上回車(chē)鍵直接生成。

def keyPressEvent(self, event):
    if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
        self.generate_certificate()

錯(cuò)誤處理:沒(méi)填名字就點(diǎn)生成?彈個(gè)提示框,別讓程序崩潰。

if not name or not award:
    QMessageBox.warning(self, "提示", "請(qǐng)?zhí)顚?xiě)完整信息")
    return

進(jìn)度提示:批量生成時(shí)顯示進(jìn)度條,讓用戶(hù)知道還要等多久。

progress = QProgressDialog("正在生成獎(jiǎng)狀...", "取消", 0, total, self)
for i, row in df.iterrows():
    if progress.wasCanceled():
        break
    progress.setValue(i)
    # 生成獎(jiǎng)狀...

最終效果:兩小時(shí)交差,領(lǐng)導(dǎo)說(shuō)“不錯(cuò)”

周六上午開(kāi)始寫(xiě),午飯前搞定。周一給領(lǐng)導(dǎo)演示:輸入“張三”、“最佳員工”,點(diǎn)一下按鈕,一張燙金邊框、排版精美的獎(jiǎng)狀出現(xiàn)在屏幕上。

批量生成50張,選個(gè)文件夾,十幾秒全部輸出。

領(lǐng)導(dǎo)看了說(shuō):“這效率可以啊,以后每年都能用。”

我笑了笑沒(méi)說(shuō)話(huà),心想:這就是程序員的快樂(lè)——把重復(fù)勞動(dòng)交給代碼,把時(shí)間留給自己

如果你想自己做,這里有幾個(gè)小建議

樣式表不用背,現(xiàn)查現(xiàn)用。想要什么效果,搜“PyQt5 QPushButton樣式”就行。漸變色、陰影、圓角,網(wǎng)上大把例子。

布局別用絕對(duì)坐標(biāo)。setGeometry(x, y, w, h)寫(xiě)起來(lái)簡(jiǎn)單,換個(gè)屏幕就亂套。用QVBoxLayout、QHBoxLayout、QGridLayout這些布局管理器,窗口大小變了也能自動(dòng)適應(yīng)。

字體兼容性問(wèn)題。Windows上用“華文行書(shū)”、“微軟雅黑”沒(méi)問(wèn)題,Mac或Linux上可能找不到這些字體。可以用QFontDatabase檢測(cè)系統(tǒng)可用字體,或者把字體文件打包進(jìn)程序。

圖片保存格式。PNG格式清晰度最好,體積也小。QImage.save()默認(rèn)保存為PNG,也可以指定JPEG。

打包成exe給別人用。用PyInstaller一行命令搞定:pyinstaller --onefile --windowed award_generator.py。同事不需要裝Python,雙擊就能用。

寫(xiě)在最后

有人說(shuō),寫(xiě)這種小工具是“重復(fù)造輪子”。我不這么看。

市面上確實(shí)有成型的獎(jiǎng)狀生成軟件,但它們要么收費(fèi),要么操作復(fù)雜,要么模板固定不能滿(mǎn)足需求。自己寫(xiě)一個(gè),完全按自己的工作流來(lái)設(shè)計(jì),想加什么功能隨時(shí)加。

這次是獎(jiǎng)狀生成器,下次可能是合同生成器、工牌生成器、標(biāo)簽打印器……掌握了PyQt5這套東西,能解決工作中各種“批量生成”類(lèi)的需求。

代碼寫(xiě)完了,丟到GitHub上。需要的同事自取,有問(wèn)題找我。這就是程序員的“授人以漁”。

兩小時(shí)換未來(lái)每年省下的幾個(gè)小時(shí),這筆賬,怎么算都不虧。

?以上就是Python結(jié)合PyQt5打造一個(gè)高顏值的可視化獎(jiǎng)狀生成器的詳細(xì)內(nèi)容,更多關(guān)于Python獎(jiǎng)狀生成器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python學(xué)習(xí)入門(mén)之區(qū)塊鏈詳解

    Python學(xué)習(xí)入門(mén)之區(qū)塊鏈詳解

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

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

    這篇文章主要給大家介紹了關(guān)于Python中正則表達(dá)式妙用之以搜索電子郵件地址為例的相關(guān)資料,正則表達(dá)式經(jīng)常被用到,而自己總是記不全,匯總一份完整的以備不時(shí)之需,需要的朋友可以參考下
    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的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 如何學(xué)習(xí)Python time模塊

    如何學(xué)習(xí)Python time模塊

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

    基于Python和MoviePy實(shí)現(xiàn)照片管理和視頻合成工具

    在這篇博客中,我們將詳細(xì)剖析一個(gè)基于 Python 的圖形界面應(yīng)用程序,該程序使用 wxPython 構(gòu)建用戶(hù)界面,并結(jié)合 MoviePy、Pillow 和 OpenCV 等庫(kù)實(shí)現(xiàn)照片管理和視頻合成功能,通過(guò)對(duì)代碼的逐部分分析,需要的朋友可以參考下
    2025-04-04
  • 僅利用30行Python代碼來(lái)展示X算法

    僅利用30行Python代碼來(lái)展示X算法

    這篇文章主要介紹了僅利用30行Python代碼來(lái)展示X算法,同時(shí)還有對(duì)算法實(shí)現(xiàn)的復(fù)雜度的說(shuō)明,需要的朋友可以參考下
    2015-04-04
  • Matplotlib繪圖基礎(chǔ)之子圖詳解

    Matplotlib繪圖基礎(chǔ)之子圖詳解

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

    python二維鍵值數(shù)組生成轉(zhuǎn)json的例子

    今天小編就為大家分享一篇python二維鍵值數(shù)組生成轉(zhuǎn)json的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • 使用Python制作一個(gè)極簡(jiǎn)四則運(yùn)算解釋器

    使用Python制作一個(gè)極簡(jiǎn)四則運(yùn)算解釋器

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

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

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

最新評(píng)論

独山县| 通江县| 原阳县| 深州市| 昌黎县| 成武县| 湘潭县| 西峡县| 怀远县| 博湖县| 宝应县| 芦溪县| 驻马店市| 沁水县| 额尔古纳市| 丰城市| 绍兴县| 诸城市| 阿克苏市| 江陵县| 金秀| 晋州市| 古田县| 都兰县| 莱芜市| 乐都县| 砀山县| 富蕴县| 石泉县| 金坛市| 安丘市| 乐平市| 亳州市| 大邑县| 吴江市| 娱乐| 新源县| 土默特左旗| 岳普湖县| 宜城市| 连云港市|