唠叨一下
==============================================================
最近不是快过年了,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(‘设置上联’)
最后
🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。