前言

最近发现了一个非常不错的Python类库————Gooey,

https://github.com/chriskiehl/Gooey

在它的帮助下我们可以非常方便的将一个命令行程序升级成一个图形化界面程序。

https://juejin.cn/post/6971218428128411684

我们以之前的这个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()



可以看到我们这就已经生成了一个图形化界面,现在就让我们开始给这个程序增加需要的功能吧

修改程序名称

可以看到我们当前的程序名称是我们程序代码的名字,这样一点都不优雅,所以我们需要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')



第一个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可以用来对用户输入的数据进行验证,如果不符合时会进行提示。

是否输出黑白版本

有的时候不需要彩色版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打开时不会出现控制台。

最终成品

最终代码地址

https://github.com/wlzcool/ImageToPdf

生成的可执行程序

如果不方便自己生成程序

也可以从百度云下载

链接: https://pan.baidu.com/s/1eLDaLUwJlztrhP6N_Y1DXQ 提取码: gtxm

总结

所以,我们今天又掌握了Gooey的用法,开心!给我们的程序换了个漂亮的界面,真的是非常赏心悦目哦。

如果今天的文章对你有帮助,点个赞吧!

手写笔记变PDF-几行代码变命令行程序为图形化界面的更多相关文章

  1. 手写JAVA虚拟机(二)——实现java命令行

    查看手写JAVA虚拟机系列可以进我的博客园主页查看. 我们知道,我们编译.java并运行.class文件时,需要一些java命令,如最简单的helloworld程序. 这里的程序最好不要加包名,因为加 ...

  2. GuiLite 1.2 发布(希望通过这100+行代码来揭示:GuiLite的初始化,界面元素Layout,及消息映射的过程)

    经过开发群的长期验证,我们发现:即使代码只有5千多行,也不意味着能够轻松弄懂代码意图.痛定思痛,我们发现:虽然每个函数都很简单(平均长度约为30行),可以逐个击破:但各个函数之间如何协作,却很难说明清 ...

  3. Java 图形化界面设计(GUI)实战练习(代码)

    关于Java图形化界面设计,基础知识网上可搜,下面简单介绍一下重点概念,然后就由浅入深代码实例. 程序是为了方便用户使用的,Java引入图形化界面编程. 1.JFrame 是容器类 2.AWT 是抽象 ...

  4. git命令行or图形化界面?看这篇操作就够了

    我们在自己的私人分支开发好各自的模块后,就要合并到master,这个时候在idea里边先切换到master,然后update一下获取最新更新,解决一下冲突,最后再合并自己的私人分支,add,commi ...

  5. ubuntu的命令行状态和图形化界面切换 (转)

    1.ubuntu命令状态切换到图形化界面 startx 如果命令不能识别 执行 sudo apt-get install xinit 还需要提前安装桌面环境 比如 gnome 比如 KDE 安装方法 ...

  6. 30个类手写Spring核心原理之AOP代码织入(5)

    本文节选自<Spring 5核心原理> 前面我们已经完成了Spring IoC.DI.MVC三大核心模块的功能,并保证了功能可用.接下来要完成Spring的另一个核心模块-AOP,这也是最 ...

  7. [快速傅立叶变换&快速傅里叶变换]【旧 手写笔记】

    $FFT$好美啊 参考资料: 1.算法导论 2.Miskcoo 3.Menci 4.虚数的意义-阮一峰 简单说一下,具体在下面的图片 实现: 可以用$complex$也可以手写 和计算几何差不多 注意 ...

  8. 手写MVC框架(二)-代码实现和使用示例

    --------上一篇:手写MVC框架(一)-再出发----- 背景 书接上文,之前整理了实现MVC框架需要写哪些东西.这周粗看了一下,感觉也没多少工作量,所以就计划一天时间来完成.周末的时间,哪会那 ...

  9. 树莓派点亮LED灯需要几行代码?3行。小孩子都能学会

    目录 点亮LED灯 硬件连接 代码 闪烁的LED灯 呼吸灯 其他 点亮LED灯 硬件连接 找一个LED灯,连接如上图,注意长短引脚,经过这些年的狂轰乱炸,大家对于这个应该不漠视,毕竟Arduino都进 ...

随机推荐

  1. 十、.net core(.NET 6)搭建ElasticSearch(ES)系列之Java环境搭建和Node.js环境搭建

    安装java jdk环境:我此处使用的是jdk16版本.下载地址: https://www.oracle.com/java/technologies/javase-jdk16-downloads.ht ...

  2. Scrapy爬虫返回302重定向问题解决方法

    scrapy爬虫遇到爬取页面时302重定向导致response页面与实际需要爬取的页面信息不一致,导致无法正常获取信息,查看日志存在 scrapy.downloadermiddlewares.redi ...

  3. OpenResty搭建高性能服务端

    OpenResty搭建高性能服务端   Socket编程 Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select.poll.epoll是Linux API提 ...

  4. Go语言介绍(背景、特点)

    一.go语言的背景 Go是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go(又称 Golang)是 Google 的 Rob Pike(罗勃.派克),Ken Thompson(肯· ...

  5. Proteus中包含的主流单片机列举

    经常使用Proteus的朋友面临的一个问题就是,这个设计用Proteus能仿真吗?在初级阶段,我们仅仅会参考Proteus是否有对应的器件以及器件是否有仿真模型来决断这个问题.有就能仿真,没有就不能仿 ...

  6. NVIDIA DGX SUPERPOD 企业解决方案

    NVIDIA DGX SUPERPOD 企业解决方案 实现大规模 AI 创新的捷径 NVIDIA DGX SuperPOD 企业解决方案是业界首个支持任何组织大规模实施 AI 的基础架构解决方案.这一 ...

  7. java后端知识点梳理——多线程与高并发

    进程与线程 进程是一个"执行中的程序",是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,一个进程中一般拥有多个线程. 线程和进程的区别 进程是操作系统分配资源的最小单 ...

  8. springboot注解之@ConditionalOnProperty

    最近在研究springboot的源码,看到很多@ConditionalOnXxx的注解,大概明白此注解的意思,就是判断条件,这个条件就是Xxx,例如ConditionalOnProperty就是判断配 ...

  9. 谁能干掉了if else

    很多人觉得自己写的是业务代码,按照逻辑写下去,再把公用的方法抽出来复用就可以了,设计模式根本就没必要用,更没必要学. 一开始的时候,我也是这么想,直到我遇到... 举个例子 我们先看一个普通的下单拦截 ...

  10. Nginx报400 Bad Request

    本地遇到此问题,关闭浏览器,重新运行代码即可