这又是一篇用Python写小软件系列,最近有点写上瘾了,文件压缩和解压我们在日常工作学习中会经常用到,比如winrar、快压、好压等压缩软件,猿人学用Python做个简易图形界面的压缩软件。

打开之后的界面长这个样子:

压缩完成后是这个样子:

解压完成后是这个样子:

看到这个界面,阅读过猿人学之前文章《给宝宝的翻译小软件(续):支持PDF啦!》的老朋友应该能认出来,这是在那个翻译软件的GUI界面上修改的,哈哈。

Python压缩软件程序实现和分析过程

首先不像商业压缩软件,我把功能简化了很多,只实现主要的压缩(压缩文件和文件夹)和解压功能。

Python有一些第三方压缩和解压的库,我选用了zipfile,把文件压缩为.zip,图形化选用了pyqt5,因为之前翻译软件实现过图形化,所以就偷懒拿过来改一下用。

程序的运行流程是(对照上面的图看):

首先在下拉框选择是“压缩”还是“解压”,然后点击“选择“按钮选择要执行的文件,选择完成后点击右下角的“开始”按钮,软件就开始执行了。

整个过程比较简单,主要两个地方卡壳了一下,耗了点时间去解决。

Python压缩程序第一个卡壳地方是:

因为要实现压缩文件和文件夹的功能,所以当点击图形界面的”选择“按钮时要支持既能选择文件,又能选择文件夹。

但是Qt的QFileDialog不支持这样的实现,提供的控件要么只能选文件,要么只能选文件夹,对此花了好几个小时去研究和查阅资料,得出的结论是要继承QFileDialog类,然后重写这个类的部分方法来,实现既能选文件又能选文件夹的功能,于是趟坑去实现了一把,对Qt本身的机制也是一知半解,所以调试了很久。

重新实现的QFileDialog类代码如下:

class FileDialog(QtWidgets.QFileDialog):

def __init__(self, *args, **kwargs):

super(FileDialog, self).__init__(*args, **kwargs)

self.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True)

self.setFileMode(QtWidgets.QFileDialog.ExistingFiles)

self.tree = self.findChild(QtWidgets.QTreeView)

self._selFile = ''

def accept(self):

inds = self.tree.selectionModel().selectedIndexes()

self._selFile = os.path.join(str(self.directory().absolutePath()),str(inds[0].data()))

print('_selfile:',self._selFile)

self.hide()

def selectedFiles(self):

return self._selFile

第二个Pyhthon压缩程序卡壳的地方是:

我把整个程序都写完了,测试了几把没有问题,自己沾沾自喜这个程序真完美。第二天又想起了,想再完整的测试一下,毕竟要写在猿人学公众号上,被人挑刺心里总是不好受的。结果发现压缩时会把你的整个文件路径上的文件夹都压缩进去。

举个栗子:

比如要压缩的文件路径是:D:/log/nginx/access.log

压缩是:D:/log/nginx/access.zip

解压后,正常情况应该是把文件还原为:

D:/log/nginx/access/access.log

但是实际上解压后变成了:

D:/log/nginx/access/log/nginx/access.log

就是程序在压缩的时候把文件路径上的目录也都压缩进去了。

这也调试了好一会,开始以为是把文件路径给传错了。

结果是自己对zipfile的使用没研究清楚,错误示例如下:

z = zipfile.Zipfile('D:/log/nginx/access.zip')

z.write('D:/log/nginx/access.log')

z.close()

这样就会把文件路径上的目录全都压缩进去。正确的用法是:

z = zipfile.Zipfile('D:/log/nginx/access.zip')

z.write('D:/log/nginx/access.log','access.log')

z.close()

为什么头一天测试没有发现这个问题呢?

因为我之前测试要压缩的文件路径是这样的:D:/access.log

文件在根目录下面,文件路径上没有其他目录了,所以就发现不了。

这也告诉我们测试一定要多角度,多场景测试啊。

两个Python源文件,200多行代码搞定,再一次感叹用Python就是方便。

把Python压缩程序打包成exe文件

一样可以使用pyinstaller把程序打包成exe文件,就可以把exe文件发给其他朋友使用了,他们的电脑没有Python开发环境也能运行此程序,当然为了程序稳定,你最好多在几台电脑上测试一下。

打包命令:

pyinstaller -F -w -i icon.ico transdocx.py

Python压缩程序文件结构:

一个zip_main.py文件(图形界面),一个zip_console.py文件(压缩功能),开发图形界面程序通常是这样,把图形界面部分和业务功能部分要分离,相互不干扰,也方便以后修改。

程序运行方法:python zip_main.py

Python压缩程序不足之处

1.这个程序只能压缩和解压zip文件,不支持rar、tar。

2.没有严格的容错处理

3.不支持加密压缩和解压

还是一样,猿人学Python公众号后台回复:压缩 获得源代码。

Python小软件系列阅读:

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。

***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.com 原创,没有猿人学授权,请勿以任何形式转载。***

python编写的软件界面-用Python写一个带图形界面的文件压缩软件相关推荐

  1. 用java的jni调用C语言的API,实现带图形界面的一元稀疏多项式计算器

    实现步骤: 1) 完成Java代码,编写好Java调用类. 2) 编译你的Java类. 3) 用javah生成编译好的class文件对应的C/C++ 函数的头文件. 4) 实现头文件中的函数原型,编写 ...

  2. pythongui登录界面密码显示_用python写一个带有gui界面的密码生成器

    需要用到的库: tkinter:构建gui界面 pyperclip:复制功能 random:生成随机数 string:处理字符串 代码: from tkinter import * import ra ...

  3. python的image读取的图片是什么类型的-python如何实现读取并显示图片(不需要图形界面)...

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1 ...

  4. python界面图片-python如何实现读取并显示图片(不需要图形界面)

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...

  5. python汽车类型识别源代码带图形界面,基于PyTorach深度学习

    python汽车类型识别源代码带图形界面,基于torch深度学习,目前可识别公交车, 货车,客运车, 面包车, 皮卡车, 小轿车,程序包中已含模型文件 完整代码下载地址:python汽车类型识别源代码 ...

  6. java写一个登录系统_用java写一个用户登陆界面

    一.课堂测试源代码及其结果截图 用java的swing写一个用户登录界面,采用网格布局.源代码如下: /** * */ package LiuLijia; import java.awt.CardLa ...

  7. 【linux下用C语言编写带图形界面的成绩管理系统附带源代码】

    linux下用C语言编写带图形界面的成绩管理系统附带源代码:(下面内容请配合源代码看) 源代码下载地址:         点击打开链接 或留下联系方式,发给你 一.题目内容 嵌入式Linux数据库编程 ...

  8. DuiVision开发教程(2)-如何写一个简单的界面程序

    基于DuiVision界面库开发的界面程序主要包括如下几部分内容: 1.资源定义,包括图片资源.各个窗口界面的xml定义文件 2.事件处理类代码,用于处理界面响应消息 3.其他业务逻辑代码 下面举例说 ...

  9. 做一个支持图形界面的操作系统(上)

    分类: OS2006-05-01 20:00 856人阅读 评论(0) 收藏 举报 原文:http://www.binghua.com/Article/Class6/Class7/200409/267 ...

最新文章

  1. [转]小硕3年是怎样发6篇SCI的
  2. session and cookie
  3. 【Redis】2. Redis数据类型 String以及key的设置约定
  4. java高级----Thread之ScheduledExecutorService的使用
  5. import 别名_Python基础找茬系列09--import和from-import的引用区别
  6. 嵌入式linux tftp rpm,嵌入式linux的tftp配置
  7. python email模块详解_python模块之email: 电子邮件编码解码 (一、解码邮件)
  8. 【微信小程序】带你做一个公众号留言系统(附源码)
  9. 如何用方正飞腾做出“凹”形文本框
  10. Mutex(互斥锁)
  11. c++中变量名和变量值
  12. 关于进行安装程序出现注册DLL/OCX失败,返回码:0x5问题
  13. android pdf417条码,条码控件Dynamsoft Barcode Reader教程:从PDF417驾驶执照中提取数据...
  14. Apizza--特别好用的 Http请求模拟工具 PHP写接口然后测试详细教程
  15. win10 -- 注册机认为是病毒,死活不让下载 --那就关了它的自带杀毒软件
  16. java背景颜色代码_java设定背景颜色
  17. 图形 3.6 纹理压缩——包体瘦身术——RGBA与ASTC与ETC2压缩与实际对比体验
  18. 看我如何自制安全的远程控制工具
  19. 转换上课周次字符串(我带着困惑我一周之久的编程题来了)
  20. 关于恶意说说自动在QQ空间转发的机制

热门文章

  1. ResNeXt——与 ResNet 相比,相同的参数个数,结果更好:一个 101 层的 ResNeXt 网络,和 200 层的 ResNet 准确度差不多,但是计算量只有后者的一半...
  2. leetcode 191. Number of 1 Bits
  3. ES transport client使用
  4. python3.6 在 windows10 下使用pycrypto
  5. mysql 速度优化
  6. 数据分析系列精彩浓缩(二)
  7. Html5 History API解析
  8. qt 实现的电视遥控系统,如何让qt响应来自遥控器的按键信息?
  9. Zabbix监控详解
  10. CSS3 animation-timing-function steps()