如何用python编写一个生成春联软件

作者:轻松学Python 时间:2021-12-12 07:27:47 

前言

最近不是快过年了,Python写对联挺火的,但是代码又不是人人都用,那就直接写个界面打包一下呗~

主要实现只要运行后输入上联下联、横批,然后自动生成春联保存在代码文件夹,如果要打印出来也是可以的。

效果展示

输入对联,选择路径后点击开始生成春联即可。

如何用python编写一个生成春联软件

如何用python编写一个生成春联软件

如何用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

获取文字主题

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: 这样就切换成功了。

如何用python编写一个生成春联软件

输入 cd 将你的代码存放地址粘贴进去

如何用python编写一个生成春联软件

这样就切换到你的代码存放目录了

然后输入 pyinstaller -F -w -i 图标名称.ico 代码文件名.py

如:pyinstaller -F -w -i aaa.ico zzz.py

等待打包完成即可

来源:https://blog.csdn.net/ooowwq/article/details/122642709

标签:python,春联
0
投稿

猜你喜欢

  • python爬虫之异常捕获及标签过滤详解

    2021-08-10 07:32:06
  • Python PyQt5学习之自定义信号

    2022-01-06 12:03:52
  • 使用JavaScript访问XML数据

    2023-06-29 22:19:08
  • python通过opencv实现批量剪切图片

    2021-05-12 12:50:14
  • python构造函数init实例方法解析

    2022-09-30 15:09:19
  • python代码过长的换行方法

    2022-12-25 07:19:59
  • php二分查找二种实现示例

    2023-11-21 00:40:13
  • jquery效率探索

    2008-01-08 18:06:00
  • 浏览器用户体验:Firefox初体验 VS The world

    2008-08-02 11:58:00
  • ASP伪静态页简单教程

    2007-09-28 14:35:00
  • 基于PyQt5制作Excel文件数据去重小工具

    2023-10-14 05:44:58
  • Python中对列表排序实例

    2021-12-05 17:41:28
  • Python+ Flask实现Mock Server详情

    2021-02-11 19:56:28
  • ASP从数据库中获取下载文件

    2007-10-06 21:17:00
  • python钉钉机器人运维脚本监控实例

    2022-08-23 22:19:48
  • Python中使用Inotify监控文件实例

    2021-03-03 14:17:05
  • 人工智能学习pyTorch的ResNet残差模块示例详解

    2022-05-04 21:45:22
  • asp 删除数据并同时删除图片的代码

    2011-02-28 10:39:00
  • Python编程matplotlib绘图挑钻石seaborn小提琴和箱线图

    2022-03-06 20:08:29
  • Django框架安装及项目创建过程解析

    2022-09-20 12:55:45
  • asp之家 网络编程 m.aspxhome.com