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 ...
随机推荐
- C# 实现窗体底部滚动字幕
使用的控件 panel和label及其定时器. 实现原理 通过定时器定时将label的位置在panel上进行移动,实现滚动的视觉效果,此处将label放在panel上的好处是可以单独设置滚动字母的背景 ...
- 6. C语言bool类型
C89没有定义布尔类型,所以C语⾔判断真假时以0为假,⾮0为真.所以我们通常使⽤逻辑变量的做法: 1 //宏定义布尔类型 2 3 #define BOOL int 4 5 #define TRUE 1 ...
- 简单的js hook
// ==UserScript== // @name ethereum request // @namespace http://tampermonkey.net/ // @version 0.1 / ...
- python 知识点总结
第一张 1)变量 内存空间的表达式 命名要遵守规则 赋值使用 = 2)类型转换 str()将其他类型转成字符窜 int() 将其他类型转成整数 float()将其他类型转成浮点数 3)数据类型 整数类 ...
- JS学习-Canvas-Transformations变换
Canvas -Transformations变换 save() 保存画布(canvas)的所有状态 restore() 是 Canvas 2D API 通过在绘图状态栈中弹出顶端的状态,将 canv ...
- 【IDEA】测试类(test)的模板及定义
人和动物的区别是:能制造和使用工具.因为,工具大大便利了我们的生活. 我们在使用Idea开发java项目的过程中,有些代码是固定的,我们能不能只写几个字,就代表一连串的代码.例如,这里,我们只是输入了 ...
- Tplmap-20220206
Usage: python tplmap.py [options] 选项: -h, --help 显示帮助并退出 目标: -u URL, --url=URL 目标 URL -X REQUEST, -- ...
- 威纶通作为modbusTcp主站应用
1.在威纶通中添加modbus Tcp,作为主机,在Tcp服务器客户端模型中作为客户端: 2.威纶通地址与modbus标准功能码的对应关系: 地址1x_single_Bit,对应02功能码(读输入线圈 ...
- css 径向渐变实现渐变小圈
效果如下图: 代码如下: .b-list .ceil .line { height: 20px; width: 100%; margin: 0 auto; background: radial-gra ...
- 常用的CSS效果(1)
单行省略 overflow: hidden; text-overflow: ellipsis; white-space: nowrap; 多行省略 display:-webkit-box; overf ...