热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

在这里插入图片描述

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

在这里插入图片描述

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

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

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

等待打包完成即可

总结

到此这篇关于如何用python编写一个生成春联软件的文章就介绍到这了,更多相关python生成春联软件内容请搜索编程笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程笔记!


推荐阅读
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了一个Python函数same_set,用于判断两个相等长度的数组是否包含相同的元素。函数会忽略元素的顺序和重复次数,如果两个数组包含相同的元素,则返回1,否则返回0。文章还提供了函数的具体实现代码和样例输入输出。 ... [详细]
  • Python的参数解析argparse模块的学习
    本文介绍了Python中参数解析的重要模块argparse的学习内容。包括位置参数和可选参数的定义和使用方式,以及add_argument()函数的详细参数关键字解释。同时还介绍了命令行参数的操作和可接受数量的设置,其中包括整数类型的参数。通过学习本文内容,可以更好地理解和使用argparse模块进行参数解析。 ... [详细]
  • 在一对一直播源码使用过程中,有时会出现软键盘切换闪屏问题,就是当切换表情的时候屏幕会跳动,因此要对一对一直播源码表情面板无缝切换进行优化。 ... [详细]
author-avatar
ndmlhr
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有