欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

利用PyQt5生成过年春联

程序员文章站 2022-06-16 13:05:50
需求说明:通过在界面上输入春联的上、下批和横批汉字从而生成春联图像,最后将春联图片保存。有实际需要的还可以将春联打印。实现过程:实现思路是先下载好春联的背景图片,再下载每个汉字的文字图片将文字图片粘贴...

需求说明:

通过在界面上输入春联的上、下批和横批汉字从而生成春联图像,最后将春联图片保存。有实际需要的还可以将春联打印。

利用PyQt5生成过年春联

利用PyQt5生成过年春联

实现过程:

实现思路是先下载好春联的背景图片,再下载每个汉字的文字图片将文字图片粘贴到春联背景上。所以这里有用了一个春联图片的三方获取地址。

http://xufive.sdysit.com/tk

春联生成部分参考了 csdn 博客平台。

网络数据获取相关模块

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

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('横批演示.jpg'))

        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('由于上下联不好预览,请使用图片查看器预览,目前仅支持横批图片预览...')

春联文字获取主题代码

  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))  # 单个文字的形状是正方形,所以这里的长、宽都是一致的

效果图

利用PyQt5生成过年春联

到此这篇关于利用pyqt5生成过年春联的文章就介绍到这了,更多相关pyqt5春联内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关标签: PyQt5 春联