几行代码变命令行程序为图形化界面

本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,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的用法,开心!给咱们的程序换了个漂亮的界面,真的是很是赏心悦目哦。
若是今天的文章对你有帮助,点个赞吧!

相关文章
相关标签/搜索