手寫筆記變PDF-幾行程式碼變命令列程式為圖形化介面

羽商宮發表於2021-07-19

前言

最近發現了一個非常不錯的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的用法,開心!給我們的程式換了個漂亮的介面,真的是非常賞心悅目哦。
如果今天的文章對你有幫助,點個贊吧!

相關文章