幾行代碼變命令行程序爲圖形化界面

本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!前端

前言

最近發現了一個很是不錯的Python類庫————Gooey, github.com/chriskiehl/…python

在它的幫助下咱們能夠很是方便的將一個命令行程序升級成一個圖形化界面程序。 juejin.cn/post/697121… 咱們以以前的這個Python 圖片合併pdf的命令行程序做爲例子來進行講解,但願能幫助到你們。git

安裝

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

pip install Gooey  
複製代碼

用法簡介

只須要在咱們的代碼方法開頭加入@Gooey便可shell

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來顯示咱們須要的名稱。markdown

@Gooey( program_name='圖片合併pdf', )
複製代碼

更新目標程序

咱們使用的是我以前編寫的一個命令行程序,它能夠將一個文件夾中的圖片整個變成一個PDF, juejin.cn/post/697121… 對於常常須要把本身的手寫筆記轉成pdf的同窗幫助很大,可是它是一個命令行程序,操做起來仍是有點不太方便,此次咱們就把它變成圖形化界面程序。app

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))
複製代碼

這是咱們現有的代碼,須要對其進行一些改造才能夠符合咱們的要求oop

提取參數

要想使用Gooey,首先咱們得把咱們的參數整個拿到最前面來,這樣保證這裏可以更加清晰的賦值。post

圖片文件夾所在路徑

這個參數是咱們要合併的圖片所在的文件夾路徑,咱們對應的可使用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,咱們可使用此選項來進行黑白版本的選擇 github.com/chriskiehl/…

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

最終代碼地址

github.com/wlzcool/Ima…

生成的可執行程序

若是不方便本身生成程序 也能夠從百度雲下載 連接: pan.baidu.com/s/1eLDaLUwJ… 提取碼: gtxm

總結

因此,咱們今天又掌握了Gooey的用法,開心!給咱們的程序換了個漂亮的界面,真的是很是賞心悅目哦。
若是今天的文章對你有幫助,點個贊吧!

相關文章
相關標籤/搜索