用python寫一個自動生成春聯的軟件,打包exe,打包好的放在最后了


嘮叨一下

年前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
#兄弟們學習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: 這樣就切換成功了。
在這里插入圖片描述
輸入 cd 將你的代碼存放地址粘貼進去
在這里插入圖片描述
這樣就切換到你的代碼存放目錄了

然后輸入 pyinstaller -F -w -i 圖標名稱.ico 代碼文件名.py

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

等待打包完成即可

完整代碼和exe軟件我都放在藍奏雲了,直接獲取
https://wwi.lanzoul.com/b03ufjvnc 密碼:1024


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM