前言

最近发现了一个非常不错的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. GO学习-(9) Go语言基础之切片

    Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...

  2. Manjaro Linux安装singularity-container

    技术背景 容器化技术在各种生产领域已经得到了广泛的应用,这得益于容器的轻量化(相比于虚拟机而言),安全性(隔离弱于虚拟机,但是权限控制得当的情况下也可以认为是安全隔离的)以及系统级虚拟化带来的高可用性 ...

  3. 性能监控工具之Grafana+Prometheus+Exporters

    在本模块中,我将把几个常用的监控部分给梳理一下.前面我们提到过,在性能监控图谱中,有操作系统.应用服务器.中间件.队列.缓存.数据库.网络.前端.负载均衡.Web 服务器.存储.代码等很多需要监控的点 ...

  4. pycharm在虚拟机跑深度学习Mac

    1.在PyCharm里配置部署环境 打开PyCharmTools > Deployment > Configuration, 新建一个SFTP服务器,名字自己取: 输入如下图配置,注意这里 ...

  5. jmeter--文件上传和下载

    文件下载 文件下载的method一般是get.本例中导出excel文件. 下载文件如果要求下载到本地,需要另写脚本.采用jsr223或者beashell PostProcessor都可以. 代码如下: ...

  6. 配置IPv6公网地址DDNS并开放外网访问端口

    目前使用三大运营商宽带服务都会下发公网IPv6地址,这样我们想要在外网访问家里的路由.NAS等设备就可以直接通过IPv6地址来访问了.但是每次重新拨号后IPv6地址都会改变,而且IPv6的地址很长,这 ...

  7. 关于win10 samba访问提示用户名和密码错误的原因

    排除掉linux上的配置错误,只需要做到以下两步就可以了: 1.win10系统运行secpol.msc 打开本地安全策略 2.安全策略->本地策略->安全选项 3.右侧找到 网络安全:LA ...

  8. 百炼 POJ2393:Yogurt factory【把存储费用用递推的方式表达】

    2393:Yogurt factory 总时间限制:  1000ms 内存限制:  65536kB 描述 The cows have purchased a yogurt factory that m ...

  9. STP协议与MSTP协议

    STP协议与MSTP协议 目录 一.STP概述 1.1.交换网络环路的产生 1.2.STP简介 二.生成树算法 2.1.生成树算法的步骤 2.2.网桥 ID 2.3.选择根端口 2.4.选择指定端口 ...

  10. 4.2 万 Star!开发 Web 和移动端应用的全栈平台

    [导语]:Meteor 是一个用 JS 开发现代 Web 应用程序的平台.它是开源的,在 GitHub 上有 4.2 万 Star. Meteor 是什么? 官方文档是这样描述 Meteor 的:Me ...