Python 户外俱乐部·登顶纪念证书生成器

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: Python 户外俱乐部·登顶纪念证书生成器

每个周末,我喜欢和户外俱乐部的小伙伴们一起到野外登山徒步,一晃有七、八个年头了。前些天受天行健户外聚乐部群主的委托,要给一批驴友用photoshop制作登顶纪念证书(图片),就是拿来给完成登顶的驴友们发发微信朋友圈的图片,同时顺带也给俱乐部做了广告。于是乎,我索性用python做了个小软件,这样用软件生成多省事,不用每次活动都要花时间PS了。




软件界面


5b1540ef033c43838d902dd0a5439607.png



源代码

certific.pyw


import pyautogui as pg
import datetime as dt
import tkinter as tk
import tkinter.font as tkFont
from PIL import Image,ImageTk,ImageGrab
def winOpen(W,H):
    X,Y = pg.size()
    X0 = (X-W)//2
    Y0 = (Y-H)//2
    winSize = str(W)+'x'+str(H)
    winPos = winSize+'+'+str(X0)+'+'+str(Y0)
    win.geometry(winPos)
    win.resizable(False,False)
    win.wm_attributes('-topmost',True)
    wTitle = u'登顶纪念证书生成器'
    win.title(wTitle)
    initWidget()
    fillText()
    win.update()
def initWidget():
    global canvas,bgImg,et
    canvas = tk.Canvas(win,width=600,height=800,bg='white')
    canvas.place(x=0,y=0)
    image = Image.open('certific.png')
    bgImg = ImageTk.PhotoImage(image)
    canvas.create_image(300,400,image = bgImg)
    lbText=['线路:','证书:','姓名:','高峰:','简介:','日期:']
    etText=['苏州·灵树线','登顶纪念证书','青荷莲子',
            '大阳山·箭阙峰','海拔:338米']
    d = dt.date.today()
    strDate = '{0:04}.{1:02}.{2:02}'.format(d.year,d.month,d.day)
    etText.append(strDate)
    xLeft,yTop,yStep=630,50,60
    etWidth=243
    et,lb = [],[]
    for i in range(len(lbText)):
        et.append(0)
        et[i] = tk.Entry(win)
        et[i].place(x=xLeft,y=yTop+yStep*i,width=etWidth)
        et[i].insert(0,etText[i])
        lb.append(0)
        lb[i] = tk.Label(win, text=lbText[i],anchor='w')
        lb[i].place(x=xLeft,y=yTop+yStep*i-26)
    bX,bY = 650,400
    bTitle = u'内容修改'
    tBtn1 = tk.Button(win,text=bTitle,command=fillText)
    tBtn1.place(x=bX,y=bY,width=bW,height=bH)
    bX += 120
    bTitle = u'生成证书'
    tBtn1 = tk.Button(win,text=bTitle,command=saveImage)
    tBtn1.place(x=bX,y=bY,width=bW,height=bH)
    bX,bY = 650,460
    bTitle = u'导入名单'
    tBtn1 = tk.Button(win,text=bTitle,command=importList)
    tBtn1.place(x=bX,y=bY,width=bW,height=bH)
    bX += 120
    bTitle = u'批量生成'
    tBtn1 = tk.Button(win,text=bTitle,command=batchCertific)
    tBtn1.place(x=bX,y=bY,width=bW,height=bH)
def fillText():
    global et,idText
    yTop = [55,110,305,490,540,725]
    font = [tkFont.Font(family='微软雅黑', size=25, weight='bold'),
            tkFont.Font(family='微软雅黑', size=35, weight='bold'),
            tkFont.Font(family='楷体', size=26),
            tkFont.Font(family='黑体', size=22),
            tkFont.Font(family='宋体', size=20),
            tkFont.Font(family='微软雅黑',size=18)]
    color = ['#33a3d0','#33a3d0','#6d6d6d',
             '#0ab193','#4cc580','#4cc580']
    count = len(yTop)
    try:
        for i in range(count):
            canvas.itemconfig(idText[i],text=et[i].get(),fill=color[i])
    except:
        idText = [0]*count
        for i in range(count):
            idText[i] = canvas.create_text(300,yTop[i],
                    anchor='center',font=font[i],text=et[i].get(),fill=color[i])
def grabImage(widget, filename):
    widget.update()
    x = win.winfo_rootx()+widget.winfo_x()+1
    y = win.winfo_rooty()+widget.winfo_y()+1
    w = widget.winfo_width()-4
    h = widget.winfo_height()-4
    box = (x, y, x+w, y+h)
    ImageGrab.grab().crop(box).save(filename)
def saveImage():
    global et
    grabImage(canvas,et[5].get()+et[0].get()+'·'+et[2].get()+'.png')
def importList():
    pass
def batchCertific():
    pass
if __name__ == '__main__':
    win = tk.Tk()
    wW,wH = 900,800   #窗体的宽高
    bW,bH = 90,40    #按钮的宽高
    winOpen(wW,wH)
    win.mainloop()



空白证书

certific.png,可以根据需要制作自己的“空白证书”图片:


0de9d134c46946fdbe261000ed9d0dc4-1.png




成品证书

图片宽高: 600x800;大小约200Kb

bb942573ce4449d7bcdf1f2658df9bc3.png




编译软件


保存源文件 certific.png 和空白证书的图片 certific.png 到D盘根目录,再找一个好看的程序图标文件favicon.ico。使用以下编译命令:

pyinstaller --onefile --windowed --icon="D:\favicon.ico"  certific.pyw


编译过程:

D:\>pyinstaller --onefile --windowed --icon="D:\favicon.ico"  certific.pyw
486 INFO: PyInstaller: 4.5.1
487 INFO: Python: 3.8.8
487 INFO: Platform: Windows-7-6.1.7601-SP1
495 INFO: wrote D:\certific.spec
500 INFO: UPX is not available.
。。。省略N行 。。。
46234 INFO: checking EXE
46234 INFO: Building EXE because EXE-00.toc is non existent
46235 INFO: Building EXE from EXE-00.toc
46313 INFO: Copying icons from ['D:\\favicon.ico']
46315 INFO: Writing RT_GROUP_ICON 0 resource with 20 bytes
46316 INFO: Writing RT_ICON 1 resource with 4264 bytes
46330 INFO: Updating manifest in D:\build\certific\runw.exe.6n17h0bd
46332 INFO: Updating resource type 24 name 1 language 0
46337 INFO: Appending archive to EXE D:\dist\certific.exe
55621 INFO: Building EXE from EXE-00.toc completed successfully.
D:\>


编译完成后,在 D:\dist\ 文件夹下找到可执行文件 certific.exe,一定和certific.png放在同一文件夹下才能正常运行。



后续


导入清单和批量生成的代码没有写进去


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
27天前
|
存储 索引 Python
|
28天前
|
Python
Python生成器、装饰器、异常
【10月更文挑战第15天】
|
1月前
|
传感器 大数据 数据处理
深入理解Python中的生成器:用法及应用场景
【10月更文挑战第7天】深入理解Python中的生成器:用法及应用场景
41 1
|
1月前
|
存储 数据处理 Python
深入解析Python中的生成器:效率与性能的双重提升
生成器不仅是Python中的一个高级特性,它们是构建高效、内存友好型应用程序的基石。本文将深入探讨生成器的内部机制,揭示它们如何通过惰性计算和迭代器协议提高数据处理的效率。
|
17天前
|
存储 程序员 数据处理
深入理解Python中的生成器与迭代器###
本文将探讨Python中生成器与迭代器的核心概念,通过对比分析二者的异同,结合具体代码示例,揭示它们在提高程序效率、优化内存使用方面的独特优势。生成器作为迭代器的一种特殊形式,其惰性求值的特性使其在处理大数据流时表现尤为出色。掌握生成器与迭代器的灵活运用,对于提升Python编程技能及解决复杂问题具有重要意义。 ###
|
1月前
|
存储 大数据 数据处理
Python 中的列表推导式与生成器:特性、用途与区别
Python 中的列表推导式与生成器:特性、用途与区别
24 2
|
1月前
|
存储 大数据 Python
Python 中的列表推导式和生成器
Python 中的列表推导式和生成器
18 1
|
2月前
|
机器学习/深度学习 设计模式 大数据
30天拿下Python之迭代器和生成器
30天拿下Python之迭代器和生成器
20 3
|
1月前
|
存储 大数据 数据处理
理解Python中的生成器:高效迭代的秘密
【10月更文挑战第8天】理解Python中的生成器:高效迭代的秘密
33 0
|
1月前
|
存储 大数据 程序员
深入理解Python中的生成器
【10月更文挑战第8天】深入理解Python中的生成器
13 0