(如想转载,请联系博主或贴上本博地址)

题外:关于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)-小记的更多相关文章

  1. python练习册 每天一个小程序 第0013题

    # -*-coding:utf-8-*- ''' 题目描述: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-) 地址: http://tieba.baidu.com/p/21 ...

  2. python练习册 每天一个小程序 第0001题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生 ...

  3. python练习册 每天一个小程序 第0000题

    PIL库学习链接:http://blog.csdn.net/column/details/pythonpil.html?&page=1 1 #-*-coding:utf-8-*- 2 __au ...

  4. python练习册 每天一个小程序 第0007题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但 ...

  5. python练习册 每天一个小程序 第0010题

    # -*-coding:utf-8-*- ''' 题目描述: 使用 Python 生成类似于下图中的字母验证码图片 思路: 运用PIL库加random 随机字母进行生成 ''' import rand ...

  6. python练习册 每天一个小程序 第0009题

    1 ''' 2 题目描述: 3 找出一个html文件中所有的url 4 5 思路 : 6 利用正则表达式进行匹配 7 8 ''' 9 10 11 import re 12 13 14 with ope ...

  7. python练习册 每天一个小程序 第0008题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 一个HTML文件,找出里面的正文. 6 7 思路: 8 利用Beautiful ...

  8. python练习册 每天一个小程序 第0006题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都 ...

  9. python练习册 每天一个小程序 第0005题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目说明: 你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小 ...

  10. python练习册 每天一个小程序 第0012题

    # -*-coding:utf-8-*- def test(content): text = content flag = 0 with open('filtered_words.txt') as f ...

随机推荐

  1. Day 11 11.2 文件操作

    文件操作 引言 到目前为止,我们做的一切操作,都是在内存里进行的,这样会有什么问题吗?如果一旦断电或发生意外关机了,那么你辛勤的工作成果将瞬间消失.是不是感觉事还挺大的呢?现在你是否感觉你的编程技巧还 ...

  2. SignalR基本认识以及使用

    SignalR基本认识以及使用 什么是WebSocket.SignalR WebSocket 1.WebSocket基于TCP协议,支持二进制通信,双工通信. 2.性能和并发能力更强. 3.WebSo ...

  3. Spring框架常用依赖配置--供使用时直接复制

    Spring框架常用依赖配置--供使用时直接复制 以下仅为本人工作.学习过程中所接触到的内容,不足之处请多包涵. <properties> <org.springframework. ...

  4. Android studio学习第一期

    下载工具 Android studio 参考博客https://blog.csdn.net/weixin_45406151/article/details/114531103 汉化完成 并创建了虚拟手 ...

  5. Linux下找不到SO的解决方法

    Linux下找不到so文件的解决办法 1)将.so文件路径的目录添加到/etc/ld.so.conf sudo vim /etc/ld.so.conf 将你的SO文件存放路径的根目录写进去(不带so本 ...

  6. 第二章:用Python对不同的商品销售数据进行预测分析

    文章目录 项目背景 获取数据 线性数据预测 非线性数据预测 源码地址 本文分享知识: os 模块获取上一级目录的绝对地址 pands 读取 sqlite3 数据库中的数据 用sklearn中的线性回归 ...

  7. new关键字的作用

    new关键字会进行如下的操作: 1. 创建一个空的简单JavaScript对象(即`{}`): 2. 为步骤1新创建的对象添加属性`__proto__`,将该属性链接至构造函数的原型对象 : 3. 将 ...

  8. Python基础数据类型-Number(数字)

    a = -1 # int b = 2.0 # float c = 13.11 # float d = 3.14j # complex print(type(a), type(b), type(c), ...

  9. docker安装常用软件

    linux安装docker 1.安装gcc相关 yum install gcc -y yum install gcc-c++ -y 2.安装工具包 #安装工具包 yum -y install yum- ...

  10. UVA10404

    由题意可知,这题和巴什博弈没什么关系了 相似题目:AtCoder Beginner Contest 278 F - Shiritori 预备知识:DP,博弈论的必胜态和必败态 问题的关键是确定\(f_ ...