当前位置:
首页 > 编程开发 > Python基础教程 >
-
用python写一个自动生成春联的软件,打包exe,打包好的放在最后了
唠叨一下
年前Python写对联挺火的,但是代码又不是人人都用,那就直接写个界面打包一下呗~
主要实现只要运行后输入上联下联、横批,然后自动生成春联保存在代码文件夹,如果要打印出来也是可以的。
只要软件的兄弟,我放在最后了
效果展示
输入对联,选择路径后点击开始生成春联即可。
代码
需要导入的模块
# 网络数据获取相关模块 import io # python IO 处理模块 from PIL import Image # 图像处理模块 import requests # 网络请求模块 # UI 相关模块 from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * # 主题样式模块引用 from QCandyUi import CandyWindow # 应用操作相关模块 import sys import os
#兄弟们学习python,有时候不知道怎么学,从哪里开始学。掌握了基本的一些语法或者做了两个案例后,不知道下一步怎么走,不知道如何去学习更加高深的知识。 #那么对于这些大兄弟们,我准备了大量的免费视频教程,PDF电子书籍,以及视频源的源代码! #还会有大佬解答! #都在这个群里了 924040232 #欢迎加入,一起讨论 一起学习!
获取文字主题
def run(self): up_text = self.parent.up_text.text().strip() down_text = self.parent.down_text.text().strip() h_text = self.parent.h_text.text().strip() save_path = self.parent.save_path.text().strip() if up_text == '' or down_text == '' or h_text == '' or save_path == '': self.trigger.emit('参数设置不允许为空,请设置好后重新开始!') self.finished.emit(True) else: text = up_text + ' ' + down_text self.generate_image(text, layout='V', pre=0.75, out_file=save_path + '/上下联.jpg') self.generate_image(h_text, layout='H', pre=0.75, out_file=save_path + '/横批.jpg') self.finished.emit(True)
图片、文字获取
这部分参考了天元浪子的写对联
def get_word_image(self, ch='bg', pre=1.0): ''' 单文字图片下载函数 :param ch: 默认网络请求参数'bg' :param pre: 单个文字对象 :return: 图像对象 ''' res = io.BytesIO(requests.post(url='http://xufive.sdysit.com/tk', data={'ch': ch}).content) image = Image.open(res) w, h = image.size w, h = int(w * float(pre)), int(h * float(pre)) return image.resize((w, h)) # 单个文字的形状是正方形,所以这里的长、宽都是一致的
生成对联
def generate_image(self, words, layout='V', pre=1.0, out_file=None): ''' :param words: 春联文本 :param layout: 布局:水平/垂直 :param pre: 春联比例 :param out_file: 保存文件 :return: ''' quality = 'H' if pre == 0.75: quality = 'M' elif pre == 0.5: quality = 'L' usize = {'H': (640, 23), 'M': (480, 18), 'L': (320, 12)} bg_im = self.get_word_image(ch='bg', pre=pre) self.trigger.emit('春联背景下载完成!') text_list = [list(item) for item in words.split()] rows = len(text_list) cols = max([len(item) for item in text_list]) if layout == 'V': ow, oh = 40 + rows * usize[quality][0] + (rows - 1) * 10, 40 + cols * usize[quality][0] else: ow, oh = 40 + cols * usize[quality][0], 40 + rows * usize[quality][0] + (rows - 1) * 10 out_im = Image.new('RGBA', (ow, oh), '#f0f0f0') for row in range(rows): if layout == 'V': row_im = Image.new('RGBA', (usize[quality][0], cols * usize[quality][0]), 'white') offset = (ow - (usize[quality][0] + 10) * (row + 1) - 10, 20) else: row_im = Image.new('RGBA', (cols * usize[quality][0], usize[quality][0]), 'white') offset = (20, 20 + (usize[quality][0] + 10) * row) for col, ch in enumerate(text_list[row]): if layout == 'V': pos = (0, col * usize[quality][0]) else: pos = (col * usize[quality][0], 0) ch_im = self.get_word_image(ch=ch, pre=pre) row_im.paste(bg_im, pos) row_im.paste(ch_im, (pos[0] + usize[quality][1], pos[1] + usize[quality][1]), mask=ch_im) out_im.paste(row_im, offset) self.trigger.emit('春联图片拼装完成!') if out_file: out_im.convert('RGB').save(out_file) self.trigger.emit('春联保存成功!')
UI部分代码
class GenerateScroll(QWidget): def __init__(self): super(GenerateScroll, self).__init__() self.init_ui() def init_ui(self): self.setWindowTitle('春联生成器') self.setWindowIcon(QIcon('春联.ico')) vbox_main = QVBoxLayout() self.image_label = QLabel() self.image_label.setScaledContents(True) self.image_label.setMaximumSize(650,150) self.image_label.setPixmap(QPixmap('横批演示.png')) hbox = QHBoxLayout() self.brower = QTextBrowser() self.brower.setFont(QFont('宋体', 8)) self.brower.setReadOnly(True) self.brower.setPlaceholderText('信息展示区域') self.brower.ensureCursorVisible() form = QFormLayout() self.up_label = QLabel() self.up_label.setText('设置上联') self.up_text = QLineEdit() self.up_text.setPlaceholderText('请输入上联') self.down_label = QLabel() self.down_label.setText('设置下联') self.down_text = QLineEdit() self.down_text.setPlaceholderText('请输入下联') self.h_label = QLabel() self.h_label.setText('设置横批') self.h_text = QLineEdit() self.h_text.setPlaceholderText('请输入横批') self.thread_ = WorkThread(self) self.thread_.trigger.connect(self.update_log) self.thread_.finished.connect(self.finished) self.save_path = QLineEdit() self.save_path.setReadOnly(True) self.save_btn = QPushButton() self.save_btn.setText('存储路径') self.save_btn.clicked.connect(self.save_btn_click) form.addRow(self.up_label, self.up_text) form.addRow(self.down_label, self.down_text) form.addRow(self.h_label, self.h_text) form.addRow(self.save_path, self.save_btn) vbox = QVBoxLayout() self.start_btn = QPushButton() self.start_btn.setText('开始生成春联') self.start_btn.clicked.connect(self.start_btn_click) vbox.addLayout(form) vbox.addWidget(self.start_btn) hbox.addWidget(self.brower) hbox.addLayout(vbox) vbox_main.addWidget(self.image_label) vbox_main.addLayout(hbox) self.setLayout(vbox_main)
槽函数,向文本浏览器中写入内容。
def update_log(self, text): ''' :param text: :return: ''' cursor = self.brower.textCursor() cursor.movePosition(QTextCursor.End) self.brower.append(text) self.brower.setTextCursor(cursor) self.brower.ensureCursorVisible() def save_btn_click(self): dicr = QFileDialog.getExistingDirectory(self, '选择文件夹', os.getcwd()) self.save_path.setText(dicr) def start_btn_click(self): self.start_btn.setEnabled(False) self.thread_.start() def finished(self, finished): if finished is True: self.start_btn.setEnabled(True) h_image = self.save_path.text().strip() + '/横批.jpg' if os.path.isfile(h_image): self.image_label.setPixmap(QPixmap(h_image)) self.update_log('由于上下联不好预览,请使用图片查看器预览,目前仅支持横批图片预览...')
打包exe可执行文件
以cmd为例
win+r打开运行框,输入cmd,按回车。
弹出命令提示符窗口后输入 pip install pyinstaller 安装这个pyinstaller模块
然后查看你的代码存放目录,复制下来,在命令提示符窗口切换目录。
如切换到D盘 输入 d: 这样就切换成功了。
输入 cd 将你的代码存放地址粘贴进去
这样就切换到你的代码存放目录了
然后输入 pyinstaller -F -w -i 图标名称.ico 代码文件名.py
如:pyinstaller -F -w -i aaa.ico zzz.py
等待打包完成即可
完整代码和exe软件我都放在蓝奏云了,直接获取
https://wwi.lanzoul.com/b03ufjvnc 密码:1024
出处:
https://www.cnblogs.com/hahaa/p/15881282.html
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式