用python写一个自动生成春联的软件,打包exe,打包好的放在最后了

唠叨一下

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

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

只要软件的兄弟,我放在最后了

效果展示

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

用python写一个自动生成春联的软件,打包exe,打包好的放在最后了

; 代码

需要导入的模块

网络数据获取相关模块
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: 这样就切换成功了。

用python写一个自动生成春联的软件,打包exe,打包好的放在最后了
输入 cd 将你的代码存放地址粘贴进去
用python写一个自动生成春联的软件,打包exe,打包好的放在最后了
这样就切换到你的代码存放目录了

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

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

等待打包完成即可

完整代码和exe软件我都放在蓝奏云了,直接获取
https://wwi.lanzoul.com/b03ufjvnc 密码:1024

Original: https://www.cnblogs.com/hahaa/p/15881282.html
Author: 轻松学Python
Title: 用python写一个自动生成春联的软件,打包exe,打包好的放在最后了

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/814974/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • vulnhub靶场之HACK ME PLEASE

    准备: 攻击机:虚拟机kali、本机win10。 靶机:HACK ME PLEASE,下载地址:https://download.vulnhub.com/hackmeplease/…

    Python 2023年10月13日
    053
  • 【有图有真相】Python3报错:ModuleNotFoundError: No module named ‘_bz2‘

    现象:利用docker部署python3.7 运行django结果莫名其妙的报了如下问题 说是没找到_bz2 该错误是缺失_bz2.cpython-36m-x86_64-linux…

    Python 2023年8月5日
    053
  • 长期稳定的项目—steam搬砖

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年8月3日
    054
  • 思维方式之概率思维

    如果现在有两个按钮,按下红色按钮,你可以直接拿走100万美元;按下蓝色按钮,有一半机会,你可以拿到1亿美元,但还有一半机会,你什么都拿不到。你会选哪一个? 你会按红色按钮,直接拿走…

    Python 2023年9月27日
    040
  • python简易老虎机小游戏

    目标 利用python制作简易的老虎机小游戏,模块相对简单,美观上,后期还有待提升。 游戏规则:摇色子,随机生成点数。玩家判断点数是大是小(3-10小,11-18大)。玩家开始玩游…

    Python 2023年9月19日
    053
  • 用python给游戏加上音效_添加声音到你的Python游戏

    通过添加声音到你的游戏中,听听当你的英雄战斗、跳跃、收集战利品时会发生什么。学习如何在这个 Pygame 系列中,创建一个声音平台类精灵。 Pygame 提供了一种简单的方法来集成…

    Python 2023年9月20日
    064
  • java矩形的放大缩小_在Pygame中缩放图像/矩形

    您只需更改rect的宽度和高度( w 和 h 属性) . 当鼠标移动时( MOUSEMOTION 事件被添加到队列中)并且如果选择了矩形,则将相对移动 event.rel 添加到宽…

    Python 2023年9月23日
    051
  • 数据分析第二节 numpy函数应用

    1.随机数 np.random.randint(100,200,size=(5,4)) np.random.rand(2,3)服从(0,1)正态分布的数据 np.random.no…

    Python 2023年8月28日
    065
  • Scrapy框架爬虫案例

    Scrapy框架爬虫案例 * – 1 什么是Scrapy – 2 Scrapy架构 – 3 Scrapy架构图 – 4 案例 &#8…

    Python 2023年10月1日
    046
  • rh358 final

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/supermao12/p/16687186.htmlAu…

    Python 2023年6月16日
    069
  • pytest+python3+requests+jenkins+git+allure接口测试框架

    本人将自己之前写的基于pytest和requests的 接口自动化测试框架分享出来。 请参考gitee上项目的使用说明。这里不再赘述。后期会考虑录制一个视频来介绍该框架的具体使用及…

    Python 2023年9月12日
    039
  • Pytest与Unittest自动化框架区别

    pytest unittest测试框架 1、报告 2、用例收集 3、执行用例 4、断言 5、数据驱动 6、重新运行失败的用例 7、筛选 8、前置后置的处理 9、加载测试用例 pyt…

    Python 2023年9月13日
    038
  • 【Pytorch基础】torch.nn.functional.softmax介绍

    Softmax从字面上来说,可以分成soft和max两个部分。max故名思议就是最大值的意思。Softmax的核心在于soft,而soft有软的含义,与之相对的是hard硬。很多场…

    Python 2023年8月23日
    068
  • Python 类的特殊成员方法详解

    Python 类的特殊成员方法详解 原创 mb62b9178dc218f2022-06-27 10:50:21©著作权 文章标签 编程 文章分类 Python 后端开发 ©著作权归…

    Python 2023年5月25日
    082
  • Git 便捷操作

    虽然现在有很多图形化的 Git 工具,但是命令行依然 yyds。本文记录了工作中很有用的一些 Git 操作。 背景:有的时候从原仓库fork出了一个新仓库,这个新仓库做了自己的修改…

    Python 2023年10月20日
    038
  • 54_Pandas将DataFrame、Series转换为字典 (to_dict)

    pandas.DataFrame、pandas.Series可以使用to_dict()方法转换为字典(dict类型对象)。 对于pandas.DataFrame,参数orient可…

    Python 2023年8月8日
    045
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球