手寫筆記變PDF-Gooey幾行代碼變命令行程序為圖形化界面


前言

最近發現了一個非常不錯的Python類庫————Gooey,
https://github.com/chriskiehl/Gooey

在它的幫助下我們可以非常方便的將一個命令行程序升級成一個圖形化界面程序。
https://www.cnblogs.com/wlzcool/p/13985073.html
我們以之前的這個Python 圖片合並pdf的命令行程序作為例子來進行講解,希望能幫助到大家。

安裝

最簡單的辦法就是用pip進行安裝

pip install Gooey  

用法簡介

只需要在我們的代碼方法開頭加入@Gooey即可

from gooey import Gooey

@Gooey      <--- all it takes! :)
def main():
  parser = ArgumentParser(...)
  # 其他代碼 臨時營地

基礎版本

'''
A simple Gooey example. One required field, one optional.
'''

from gooey import Gooey, GooeyParser


@Gooey()
def main():
    parser = GooeyParser(description='Process some integers.')

    parser.add_argument(
        'required_field',
        metavar='Some Field',
        help='Enter some text!')

    parser.add_argument(
        '-f', '--foo',
        metavar='Some Flag',
        action='store_true',
        help='I turn things on and off')

    parser.parse_args()
    print('Hooray!')


if __name__ == '__main__':
    main()

image.png
可以看到我們這就已經生成了一個圖形化界面,現在就讓我們開始給這個程序增加需要的功能吧

修改程序名稱

可以看到我們當前的程序名稱是我們程序代碼的名字,這樣一點都不優雅,所以我們需要program_name來顯示我們需要的名稱。

@Gooey(
    program_name='圖片合並pdf',
)

更新目標程序

我們使用的是我之前編寫的一個命令行程序,它可以將一個文件夾中的圖片整個變成一個PDF,
https://juejin.cn/post/6971218428128411684
對於經常需要把自己的手寫筆記轉成pdf的同學幫助很大,但是它是一個命令行程序,操作起來還是有點不太方便,這次我們就把它變成圖形化界面程序。

from PIL import Image
import os
import img2pdf

flag = False
while not flag:
    dirname = input("請輸入圖片文件夾所在路徑(例如d:/wlzcool):")
    flag = os.path.exists(dirname)
    if not flag:
        print("圖片文件夾所在路徑不存在!")
saveflag = False
while not saveflag:
    savedirname = input("請輸入目標圖片文件夾所在路徑(例如d:/wlzcool2):")
    saveflag = os.path.exists(savedirname)
    if not saveflag:
        print("圖片文件夾所在路徑不存在!")
        automakedir = input("是否自動創建對應文件夾?(是Y/否N):")
        if automakedir.strip().upper() == "Y":
            os.makedirs(savedirname)
            saveflag = True
files = os.listdir(dirname)
reductionFactor = int(input("請輸入長寬壓縮比(例如3):"))
if reductionFactor <= 0:
    reductionFactor = 3
isConvertBlack = input("是否輸出黑白版本?(是Y/否N):").strip().upper() == "Y"
for fname in files:
    if not fname.endswith(".jpg"):
        continue
    path = os.path.join(dirname, fname)
    savePath = os.path.join(savedirname, fname)
    if os.path.isdir(path):
        continue
    img = Image.open(path)    
    if img.size[0] > img.size[1]:
        im_rotate = img.rotate(90, expand=True)
        size = (int(im_rotate.size[0] / reductionFactor), int(im_rotate.size[1] / reductionFactor))
        im_rotate = im_rotate.resize(size)
        if isConvertBlack:
            im_rotate = im_rotate.convert("L")
        im_rotate.save(savePath, quality=95)
    else:
        size = (int(img.size[0] / reductionFactor), int(img.size[1] / reductionFactor))
        img = img.resize(size)
        if isConvertBlack:
            img = img.convert("L")
        img.save(savePath, quality=95)
filename = input("請輸入輸出文件名(例如:第一章):")
with open(filename + ".pdf", "wb") as f:
    imgs = []
    files = os.listdir(savedirname)
    for fname in files:
        if not fname.endswith(".jpg"):
            continue
        path = os.path.join(savedirname, fname)
        if os.path.isdir(path):
            continue
        imgs.append(path)
    f.write(img2pdf.convert(imgs))

這是我們現有的代碼,需要對其進行一些改造才可以符合我們的要求

提取參數

要想使用Gooey,首先我們得把我們的參數整個拿到最前面來,這樣保證這里能夠更加清晰的賦值。

圖片文件夾所在路徑

這個參數是我們要合並的圖片所在的文件夾路徑,我們對應的可以使用Gooey的DirChooser組件

parser.add_argument('dirname', metavar='圖片文件夾所在路徑', help="例如d:/wlzcool", widget='DirChooser')

image.png
第一個dirname是參數的名稱,第二個metavar是我們展示在前面的給用戶看的,如果沒有metavar的時候,第一個參數會展示到界面上。

目標圖片文件夾所在路徑

因為我們要將對應的圖片進行一下批量處理,所以還需要一個用來保存處理后的圖片的文件夾地址

parser.add_argument('savedirname', metavar='目標圖片文件夾所在路徑', help="例如d:/wlzcool2", widget='DirChooser')

圖片長寬壓縮比

手機拍照的圖片實在是太大了,需要進行一下壓縮才能保證最后生成的文件大小不會過大。這個參數就是對傳入的圖片進行長寬壓縮的,需要限制為正整數。

parser.add_argument(
    'reductionFactor',
    metavar='長寬壓縮比',
    help='例如3,需要填入大於等於1的整數',
    gooey_options={
        'validator': {
            'test': '1 <= int(user_input) ',
            'message': '長寬壓縮比需大於等於1'
        }
    })

這里面的gooey_options可以用來對用戶輸入的數據進行驗證,如果不符合時會進行提示。

image.png

是否輸出黑白版本

有的時候不需要彩色版pdf,我們可以使用此選項來進行黑白版本的選擇
https://github.com/chriskiehl/GooeyExamples/blob/master/examples/widget_demo.py

parser.add_argument(
    '-isConvertBlack', 
    metavar='是否輸出黑白版本',
    action='store_true',
    help='需要輸出黑白版本請勾選')

需要注意的是,因為是否輸出黑白這個勾選框是可選的,所以我們要在參數名這里增加一個-表示這是可選參數,另外需要注意因為我們的action是store_true,所以我們的參數isConvertBlack勾選后為True

輸出文件的文件名

這里就是很簡單的文本框,沒有什么需要注意的部分

parser.add_argument(
    'filename',
    metavar='請輸入輸出文件名',
    help='例如:第一章')

添加About

上面就介紹完所有的參數部分了,我們還可以給自己增加一個作者相關,將我們的相關信息放上去,哈哈。

將程序轉成可執行文件

不是所有的電腦都有Python環境,我們需要將腳本打包成exe方便在任意一台電腦上使用。 使用 PyInstaller 來進行腳本的打包

安裝 PyInstaller

pip install pyinstaller

打包腳本

在腳本所在的路徑的cmd中執行以下命令即可

pyinstaller -F -w yourprogram.py

這里需要加上-w參數,這樣才能保證最后生成的程序exe打開時不會出現控制台。

最終成品

image.png

最終代碼地址

https://github.com/wlzcool/ImageToPdf

生成的可執行程序

如果不方便自己生成程序
也可以從百度雲下載
鏈接: https://pan.baidu.com/s/1eLDaLUwJlztrhP6N_Y1DXQ 提取碼: gtxm

總結

所以,我們今天又掌握了Gooey的用法,開心!給我們的程序換了個漂亮的界面,真的是非常賞心悅目哦。
如果今天的文章對你有幫助,點個贊吧!


免責聲明!

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



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