欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何用python編寫(xiě)一個(gè)生成春聯(lián)軟件

 更新時(shí)間:2022年01月24日 08:39:57   作者:輕松學(xué)Python  
大家好,本篇文章主要講的是如何用python編寫(xiě)一個(gè)生成春聯(lián)軟件,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下

前言

最近不是快過(guò)年了,Python寫(xiě)對(duì)聯(lián)挺火的,但是代碼又不是人人都用,那就直接寫(xiě)個(gè)界面打包一下唄~

主要實(shí)現(xiàn)只要運(yùn)行后輸入上聯(lián)下聯(lián)、橫批,然后自動(dòng)生成春聯(lián)保存在代碼文件夾,如果要打印出來(lái)也是可以的。

效果展示

輸入對(duì)聯(lián),選擇路徑后點(diǎn)擊開(kāi)始生成春聯(lián)即可。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

代碼

需要導(dǎo)入的模塊

# 網(wǎng)絡(luò)數(shù)據(jù)獲取相關(guān)模塊
import io  # python IO 處理模塊
from PIL import Image  # 圖像處理模塊
import requests  # 網(wǎng)絡(luò)請(qǐng)求模塊

# UI 相關(guān)模塊
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

# 主題樣式模塊引用
from QCandyUi import CandyWindow

# 應(yīng)用操作相關(guān)模塊 
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('參數(shù)設(shè)置不允許為空,請(qǐng)?jiān)O(shè)置好后重新開(kāi)始!')
        self.finished.emit(True)
    else:
        text = up_text + ' ' + down_text
        self.generate_image(text, layout='V', pre=0.75, out_file=save_path + '/上下聯(lián).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):
        '''
        單文字圖片下載函數(shù)
        :param ch: 默認(rèn)網(wǎng)絡(luò)請(qǐng)求參數(shù)'bg'
        :param pre: 單個(gè)文字對(duì)象
        :return: 圖像對(duì)象
        '''
        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))  # 單個(gè)文字的形狀是正方形,所以這里的長(zhǎng)、寬都是一致的

生成對(duì)聯(lián)

    def generate_image(self, words, layout='V', pre=1.0, out_file=None):
        '''
        :param words: 春聯(lián)文本
        :param layout: 布局:水平/垂直
        :param pre: 春聯(lián)比例
        :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('春聯(lián)背景下載完成!')
        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('春聯(lián)圖片拼裝完成!')

        if out_file:
            out_im.convert('RGB').save(out_file)
            self.trigger.emit('春聯(lián)保存成功!')

UI部分代碼

class GenerateScroll(QWidget):
    def __init__(self):
        super(GenerateScroll, self).__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle('春聯(lián)生成器')
        self.setWindowIcon(QIcon('春聯(lián).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('信息展示區(qū)域')
        self.brower.ensureCursorVisible()

        form = QFormLayout()

        self.up_label = QLabel()
        self.up_label.setText('設(shè)置上聯(lián)')

        self.up_text = QLineEdit()
        self.up_text.setPlaceholderText('請(qǐng)輸入上聯(lián)')

        self.down_label = QLabel()
        self.down_label.setText('設(shè)置下聯(lián)')

        self.down_text = QLineEdit()
        self.down_text.setPlaceholderText('請(qǐng)輸入下聯(lián)')

        self.h_label = QLabel()
        self.h_label.setText('設(shè)置橫批')

        self.h_text = QLineEdit()
        self.h_text.setPlaceholderText('請(qǐng)輸入橫批')

        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('存儲(chǔ)路徑')
        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('開(kāi)始生成春聯(lián)')
        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)

槽函數(shù),向文本瀏覽器中寫(xiě)入內(nèi)容。

    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('由于上下聯(lián)不好預(yù)覽,請(qǐng)使用圖片查看器預(yù)覽,目前僅支持橫批圖片預(yù)覽...')

打包exe可執(zhí)行文件

以cmd為例

win+r打開(kāi)運(yùn)行框,輸入cmd,按回車(chē)。

彈出命令提示符窗口后輸入 pip install pyinstaller 安裝這個(gè)pyinstaller模塊

然后查看你的代碼存放目錄,復(fù)制下來(lái),在命令提示符窗口切換目錄。

如切換到D盤(pán) 輸入 d: 這樣就切換成功了。

在這里插入圖片描述

輸入 cd 將你的代碼存放地址粘貼進(jìn)去

在這里插入圖片描述

這樣就切換到你的代碼存放目錄了

然后輸入 pyinstaller -F -w -i 圖標(biāo)名稱(chēng).ico 代碼文件名.py

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

等待打包完成即可

總結(jié)

到此這篇關(guān)于如何用python編寫(xiě)一個(gè)生成春聯(lián)軟件的文章就介紹到這了,更多相關(guān)python生成春聯(lián)軟件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python日志logging模塊功能與用法詳解

    Python日志logging模塊功能與用法詳解

    這篇文章主要介紹了Python日志logging模塊功能與用法,結(jié)合實(shí)例形式詳細(xì)分析了Python日志logging模塊的基本功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • python實(shí)現(xiàn)凱撒密碼加密解密的示例代碼

    python實(shí)現(xiàn)凱撒密碼加密解密的示例代碼

    本文主要介紹了python實(shí)現(xiàn)凱撒密碼加密解密的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python numpy和matlab的幾點(diǎn)差異介紹

    Python numpy和matlab的幾點(diǎn)差異介紹

    這篇文章主要介紹了Python numpy和matlab的幾點(diǎn)差異,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python函數(shù)中的作用域規(guī)則詳解

    Python函數(shù)中的作用域規(guī)則詳解

    這篇文章主要為大家詳細(xì)介紹了Python的作用域規(guī)則,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Python使用pandas模塊實(shí)現(xiàn)表之間的關(guān)聯(lián)

    Python使用pandas模塊實(shí)現(xiàn)表之間的關(guān)聯(lián)

    在數(shù)據(jù)分析和處理中,表之間的關(guān)聯(lián)是非常常見(jiàn)的操作,本文為大家介紹了pandas中實(shí)現(xiàn)表之間的關(guān)聯(lián)有四種方式,感興趣的小伙伴可以了解一下
    2023-07-07
  • Python打開(kāi)文件,將list、numpy數(shù)組內(nèi)容寫(xiě)入txt文件中的方法

    Python打開(kāi)文件,將list、numpy數(shù)組內(nèi)容寫(xiě)入txt文件中的方法

    今天小編就為大家分享一篇Python打開(kāi)文件,將list、numpy數(shù)組內(nèi)容寫(xiě)入txt文件中的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Django學(xué)習(xí)之靜態(tài)文件與模板詳解

    Django學(xué)習(xí)之靜態(tài)文件與模板詳解

    這篇文章主要為大家詳細(xì)介紹了Django靜態(tài)文件與模板,使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Python Web框架之Django框架Model基礎(chǔ)詳解

    Python Web框架之Django框架Model基礎(chǔ)詳解

    這篇文章主要介紹了Python Web框架之Django框架Model基礎(chǔ),結(jié)合實(shí)例形式分析了Django框架Model模型相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • python數(shù)據(jù)分析實(shí)戰(zhàn)指南之異常值處理

    python數(shù)據(jù)分析實(shí)戰(zhàn)指南之異常值處理

    數(shù)據(jù)預(yù)處理是明確分析目標(biāo)與思路之后進(jìn)行數(shù)據(jù)分析的第一步,也是整個(gè)項(xiàng)目中最基礎(chǔ)、花費(fèi)時(shí)間較長(zhǎng)的工作,下面這篇文章主要給大家介紹了關(guān)于python數(shù)據(jù)分析實(shí)戰(zhàn)指南之異常值處理的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • python3中str(字符串)的使用教程

    python3中str(字符串)的使用教程

    這篇文章主要介紹了python3中str(字符串)的使用教程,文中介紹的非常詳細(xì),對(duì)python3中各種str字符串的操作都包含這篇文章中了,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2017-03-03

最新評(píng)論