python之pyqt5-第一个pyqt5程序-图像压缩工具(2.5版本,加入多线程进度条与文件drop)-小记
(如想转载,请联系博主或贴上本博地址)
题外:关于python的多线程
python因为GIL的原因,只能利用到单核CPU性能。如程序内多是计算或循环,多线程无啥意义;如程序内多IO操作,多线程可以避免GUI界面无响应,因为上篇程序多IO操作,在此基础上给GUI程序加上多线程与进度条。
题内:
在上篇基础上加入2个功能。
①在初识PYQT5的基础上,本篇采用QThread实现多线程。
②给button加上drop,实现按钮接受文件拖拽。
效果如图:
下面放入代码:
主要就是在上篇基础上增加2个类,实现UI和逻辑分开。因为过于简单就不过多说明了。
①读写图片的IO线程类:
class Runthreadpic(QtCore.QThread):
# 通过类成员对象定义信号对象
rsignal = pyqtSignal(str)
def __init__(self):
super(Runthreadpic, self).__init__()
self.flag = 1 def __del__(self):
self.wait() def stop(self):
self.flag=0
pass def run(self):
if self.flag==1:
global usedtime4
try:
path=pic[0].replace(r'/',r'\\')
#size = (1024,600)
# 定义要调整成为的尺寸(PIL会自动根据原始图片的长宽比来缩放适应设置的尺寸)
try:
start=time.time()
img = Image.open(path) # 打开图片文件
if img.width>5:
width=img.width
height=img.height
size=(width*bs,height*bs)
img.thumbnail(size, Image.ANTIALIAS) # 使用抗锯齿模式生成缩略图(压缩图片)
f=os.path.splitext(path)
newname=f[0] + '-已压缩'
newname=newname+f[1]
img.save(newname) # , "JPEG"保存成与原文件名一致的文件,会自动覆盖源文件
#信号传给进度条100%了
self.rsignal.emit(str(int(100)))
else:
pass
except Exception as e:
print(e)
end=time.time()
#耗时
usedtime4=(format(float(end-start),'.2f'))
self.stop()
except Exception as e:
print(e)
②给button按钮增加文件拖拽到按钮功能
class Button(QPushButton):
def __init__(self, title, parent):
super().__init__(title, parent)
self.setAcceptDrops(True) droppath=str(23)
def dragEnterEvent(self, event):
global droppath
try:
droppath=event.mimeData().text()
droppath=str(droppath.replace(r'file:///',r'')).replace(r'/',r'\\')
#print(droppath)
f=os.path.splitext(droppath)
if f[1]=='.jpg' or f[1]=='.jpeg' or f[1]=='.JPG' or f[1]=='.JPEG' or f[1]=='.png' or f[1]=='.PNG' or f[1]=='.bmp' or f[1]=='.BMP':
#鼠标放开函数事件
event.accept()
else:
QMessageBox.information(self,"无效文件", "不是有效的图片文件!",QMessageBox.Yes)
except Excetion as e:
print(e) # 鼠标放开执行
def dropEvent(self, evn):
try:
start=time.time()
im = Image.open(droppath) # 打开图片
imBytes = im.tobytes() # 把图片转换成bytes流
imBytes = zlib.compress(imBytes, 9) # 对图像字节串进行压缩,第二个参数是压缩率有-1,0-9.
if im.mode == 'RGBA':
im2 = Image.frombytes('RGBA',im.size, zlib.decompress(imBytes)) # 压缩成新的图片
else:
im2 = Image.frombytes('RGB',im.size, zlib.decompress(imBytes))
f=os.path.splitext(droppath)
newname=f[0] + '-已压缩'
newname=newname+f[1]
im2.save(newname)
end=time.time()
dropusedtime=(format(float(end-start),'.2f'))
QMessageBox.information(self,"已完成", "已成功压缩图片到原有目录"+'\n'+'共耗时:'+dropusedtime+'秒',QMessageBox.Yes)
except Exception as e:
print(e) def dragMoveEvent(self,evn):
pass
python之pyqt5-第一个pyqt5程序-图像压缩工具(2.5版本,加入多线程进度条与文件drop)-小记的更多相关文章
- python练习册 每天一个小程序 第0013题
# -*-coding:utf-8-*- ''' 题目描述: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-) 地址: http://tieba.baidu.com/p/21 ...
- python练习册 每天一个小程序 第0001题
1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生 ...
- python练习册 每天一个小程序 第0000题
PIL库学习链接:http://blog.csdn.net/column/details/pythonpil.html?&page=1 1 #-*-coding:utf-8-*- 2 __au ...
- python练习册 每天一个小程序 第0007题
1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但 ...
- python练习册 每天一个小程序 第0010题
# -*-coding:utf-8-*- ''' 题目描述: 使用 Python 生成类似于下图中的字母验证码图片 思路: 运用PIL库加random 随机字母进行生成 ''' import rand ...
- python练习册 每天一个小程序 第0009题
1 ''' 2 题目描述: 3 找出一个html文件中所有的url 4 5 思路 : 6 利用正则表达式进行匹配 7 8 ''' 9 10 11 import re 12 13 14 with ope ...
- python练习册 每天一个小程序 第0008题
1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 一个HTML文件,找出里面的正文. 6 7 思路: 8 利用Beautiful ...
- python练习册 每天一个小程序 第0006题
1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都 ...
- python练习册 每天一个小程序 第0005题
1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目说明: 你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小 ...
- python练习册 每天一个小程序 第0012题
# -*-coding:utf-8-*- def test(content): text = content flag = 0 with open('filtered_words.txt') as f ...
随机推荐
- Python自动化测试更新selenium的两种方式
第一种手动实现: 来源 https://www.codeleading.com/article/73395290617/ import os import re import winreg impor ...
- 类Class
C# 类(Class) 当你定义一个类时,你定义了一个数据类型的蓝图.这实际上并没有定义任何的数据,但它定义了类的名称意味着什么,也就是说,类的对象由什么组成及在这个对象上可执行什么操作.对象是类的实 ...
- JS学习-async/await
async/await 它保证函数的返回值为 promise. 用更少的.then()块来封装代码,同时它看起来很像同步代码 注意:可能会因为大量await的promises相继发生而变慢. asyn ...
- Docker--结合 Jenkins + Gitlab 完成自动化测试的持续集成实战
本文转自:https://www.cnblogs.com/poloyy/p/13971134.html 进入 Jenkins 任务的配置页面 源码管理 构建触发器 为了安全起见生成一个 token 值 ...
- css - object-fit ie兼容
css - object-fit ie兼容 参考资料 github 解决object-fit兼容IE浏览器实现图片自适应 demo <!-- * @createDate: 2022-08-30 ...
- unity读取Excel表格保存到Sqlite数据库
1.读取Excel表格和保存sqlite数据库所用到的dll文件 下载链接:dll文件 最后如下图所示 废话不多说了,直接上代码吧 因为太长就折叠了 using System.Collection ...
- select from 多表和inner join的区别
其实两者是一样的,inner join 只是为了区分left join和right join整出来的,本质还是逐行比较
- 机器学习之pandas介绍
pandas简介 pandas全称python Data Analysis Library,是基于numpy的一种工具,pandas纳入了大量库和一些标准的数据模型,提供了高效的操作大型数据集所需的工 ...
- 七牛云服务器debug
400{ResponseInfo:com.qiniu.http.Response@16fd3806,status:400, reqId:uzcAADGFlzHUE-kW, xlog:-, xvia:, ...
- 07 从RDD创建DataFrame
1.pandas df 与 spark df的相互转换 df_s=spark.createDataFrame(df_p) df_p=df_s.toPandas() 2. Spark与Pandas中Da ...