学习python有三个星期了,算是做的第一个小工具,其实也没必要做成图形界面,只是为的GUI学习(再说技术总归给人使用的,熟练很多shell命令只是个“匠人”。)

win8下面:

ubutu 下:

虽是小工具,大版本有3个

1.命令行版

2.pyqt GUI版

3.pyqt GUI 线程版

期间也大大小小的bug修复n多次,几次重构(笑),算得上是“软件开发的小周期”吧。今天贴代码是是第3版:

saveCssImg.py

# coding: utf-8 -*-

import urllib2,urllib
import sys,re,os,urlparse
from PyQt4 import QtCore, QtGui class saveCssBackImg(QtGui.QWidget):
updateSig = QtCore.pyqtSignal(str) def __init__(self,cssUrl,savePath,parent=None):
super(saveCssBackImg, self).__init__(parent)
self.cssUrl = cssUrl
self.savePath = mkdir(savePath) def saveImg(self):
counter = 1
errnum = 0
imgList = self.getImgList()
img_num = len(imgList) for img in imgList:
img = img.strip("'")
img = img.strip('"') if re.match('^https?://', img):
imgsrc = img.split('?')[0]
else:
imgsrc = urlparse.urljoin(self.cssUrl, img).split('?')[0] imgname = os.path.split(imgsrc)[1]
try:
httpcode = urllib.urlopen(imgsrc).code
except:
httpcode = None if httpcode == 200 :
try:
urllib.urlretrieve(imgsrc, os.path.join(self.savePath,imgname))
info = u'[%2d/%2d]<a href="%s">%s</a>' %( counter, img_num , imgsrc,imgsrc )
except:
errnum += 1
info = u'[%2d/%2d]<a href="%s">%s</a> <span style="color:red">保存失败[%s]</span>' %( counter, img_num , imgsrc ,imgsrc,errnum)
else:
errnum += 1
info = u'[%2d/%2d]<a href="%s">%s</a> <span style="color:red">[%s][code:%s]</span>' %( counter, img_num , imgsrc ,imgsrc ,errnum, httpcode) self.updateSig.emit(info)
counter+=1 def getImgList(self):
allimglist = re.findall(r'url\s*\((.*?)\)', self.getCssContent())
imgList = set(allimglist)
return imgList def getCssContent(self) :
try:
rsp = urllib2.urlopen(self.cssUrl,timeout = 1)
return rsp.read()
except urllib2.URLError, e:
self.updateSig.emit('<font color=red>%s</font>' % e ) except BaseException, e:
self.updateSig.emit('<font color=red>%s</font>' % e ) def mkdir(savePath):
fullPath = os.path.join(os.getcwd(),savePath)
if not os.path.exists(fullPath) :
try:
os.mkdir(os.path.join(os.getcwd(),savePath))
return fullPath
except:
print 'can\'t creat dir: %s, please creat it manually! ' % fullPath
return
return fullPath

project_ui.py

# coding: utf-8 -*-

from PyQt4 import QtCore, QtGui
from saveCssImg import * try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig) class UI_getImg(QtGui.QDialog):
def __init__(self, parent=None):
super(UI_getImg, self).__init__(parent)
self.setupUi(self)
self.lineEdit.setText('http://simg.sinajs.cn/blog7style/css/conf/blog/article.css')
self.textBrowser.setOpenExternalLinks(True)
self.textBrowser.setLineWrapMode(QtGui.QTextEdit.NoWrap)
self.textBrowser.setStyleSheet("QTextBrowser {background: #eee; }")
self.pushButton.clicked.connect(self.goWork) def goWork(self):
self.thread = WorkerThread()
self.thread.sinOut.connect(self.outText)
self.thread.finished.connect(self.workFinished) cssUrl = str(self.lineEdit.text())
savePath = 'downImgs' self.textBrowser.setText(u'CSS文件地址: <a href="%s">%s</a><br>__________<br>' % (cssUrl,cssUrl))
self.pushButton.setDisabled(True) self.thread.setEvr(cssUrl,savePath) def workFinished(self):
self.outText(u'<br>__________<br>已退出下载!')
self.pushButton.setDisabled(False) def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(800, 407)
self.pushButton = QtGui.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(700, 20, 75, 23))
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.textBrowser = QtGui.QTextBrowser(Dialog)
self.textBrowser.setGeometry(QtCore.QRect(10, 60, 780, 341))
self.textBrowser.setObjectName(_fromUtf8("textBrowser"))
self.lineEdit = QtGui.QLineEdit(Dialog)
self.lineEdit.setGeometry(QtCore.QRect(10, 20, 670, 20))
self.lineEdit.setObjectName(_fromUtf8("lineEdit")) self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_translate("Dialog", "下载Css文件图片", None))
self.pushButton.setText(_translate("Dialog", "下载", None)) def outText(self,text):
self.textBrowser.append(text) class WorkerThread(QtCore.QThread):
sinOut = QtCore.pyqtSignal(str) def __init__(self,parent=None):
super(WorkerThread,self).__init__(parent) def setEvr(self,cssUrl,savePath):
self.cssUrl = cssUrl
self.savePath = savePath
self.start() def getMsg(self,msg):
self.sinOut.emit(msg) def run(self):
self.saveimg = saveCssBackImg(self.cssUrl,self.savePath)
self.saveimg.updateSig.connect(self.getMsg)
self.saveimg.saveImg() if __name__ == "__main__": app = QtGui.QApplication([])
ui = UI_getImg()
ui.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint)
ui.show()
app.exec_()

两处修复:

1.urllib.urlretrieve下载图片,对http status 404和403等也会保存成图片

2.QtGui.QTextBrower 横向滚动
 
github:(重构版,核心saveCssImg.py代码不再需要Pyqt)
 
接着学习了下开源利器linus前辈的另一大作git. andriod源码就是git管理的。
 

python + pyqt 实现的你下载css背景图片的小工具(最终版)的更多相关文章

  1. CSS背景图片定位

    原文:CSS背景图片定位 在网页开发中我们经常需要对图片进行分割(如下图)来使用,而不是分别提供单独的图片来调用,常见的如页面背景,按钮图标等,这样做的好处就是减少请求次数,节省时间和带宽. 对背景图 ...

  2. 利用wget 抓取 网站网页 包括css背景图片

    利用wget 抓取 网站网页 包括css背景图片 wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有.不过用它来dump比较现代的网站会有一个问题:不支持c ...

  3. Bootstrap css背景图片的设置

    一. 网页中添加图片的方式有两种 一种是:通过<img>标签直接插入到html中 另一种是:通过css背景属性添加 居中方法:水平居中的text-align:center 和 margin ...

  4. css背景图片拉伸 以及100% 满屏显示

    如何用css背景图片拉伸 以及100% 满屏显示呢?这个问题听起来似乎很简单.但是很遗憾的告诉大家.不是我们想的那么简单. 比如一个容器(body,div,span)中设定一个背景.这个背景的长宽值在 ...

  5. div css背景图片不显示

    我们在写页面时,为了便于维护,css样式通常都是通过link外部导入html的,有时在css中写入背景图片时,此时背景图片的路径应该是相对css文件的.比如,此时的文件有index.html,css. ...

  6. 【IE6的疯狂之八】链接伪类(:hover)CSS背景图片有闪动BUG

    IE6下链接伪类(:hover)CSS背景图片有闪动BUG,主要原因ie会再一次请求这张图片,或者说图片没被缓存. 例如: CSS代码 a:hover{background:url(imagepath ...

  7. 【转】链接伪类(:hover)CSS背景图片有闪动BUG

    来源:http://www.css88.com/archives/744 --------------------------------------------------------------- ...

  8. 兼容各浏览器的css背景图片拉伸代码

    需要用到背景图拉伸,找到了下面这段css代码: filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='***.jpg' , s ...

  9. css背景图片拉伸

    css背景图片拉伸 background-image:url(bg.png); -moz-background-size: 100% 100%; -o-background-size: 100% 10 ...

  10. css背景图片位置:background的position(转)

    css背景图片位置:background的position   position的两个参数:水平方向的位置,垂直方向的位置----------该位置是指背景图片相对于前景对象的 1.backgroun ...

随机推荐

  1. conan环境安装

    环境 安装conan 使用conan 搜索包 导入包 编译 打包项目 准备源码 编译成conan包 环境 ubuntu:bionic的docker image docker run -it ubunt ...

  2. 手写Pinia存储的数据持久化插件

    Pinia和Vuex的通病 Pinia和vuex的通病就是,页面刷新会导致数据丢失 解决通病 一.新建store import { defineStore } from 'pinia' //单独存放S ...

  3. 使用jquery—Canvas实现html5小游戏——《坦克大战》

    目录 1.项目背景 2.项目展示 3.设计思路 3.1.坦克移动 3.2.坦克开火 3.3.击中坦克 4.实现代码 5.总结 1.项目背景 2021年春节期间在家无聊,正好又学过一些前端的知识,因此就 ...

  4. Android 使用实现简单的音乐播放以及管理

    这里主要通过 MediaPlayer以及 AudioManager 来实现的对应的功能. 1.第一种,播放本地媒体文件: 你需要自己准备一个MP3格式的音频文件: 然后在资源目录(res)里面新建一个 ...

  5. 我曾经用“UC震惊部”震碎了很多人的三观

    Hi,欢迎大家在有空的时候做客[江涛学编程],这里是2023年的第9篇原创文章,今天写的这篇是当事人对昨天上热搜的统一回复. 我没有曾经跨过山河大海,我也没有曾经穿越人山人海,但我曾经用"U ...

  6. rvm安装ruby

    macOS11.1 打开终端 使用下面命令查看ruby版本 rvm list known 然后安装 rvm install 2.0.0 查看ruby版本 ruby -v   系统默认使用ruby版本 ...

  7. (18)go-micro微服务ELK介绍

    目录 一 什么是ELK 二 Beats的六种工具 三 ELK系统的特点 四 ELK+beats系统架构 五 ELK优点 六 最后 一 什么是ELK ELK是三个[开源软件]的缩写,分别表示:Elast ...

  8. 11月29日内容总结——SQL注入问题、视图、触发器、事务、存储过程、函数、流程控制、索引、慢查询、数据库三大范式

    目录 一.SQL注入问题 SQL注入问题引入 SQL注入概念和解决方案 二.视图 三.触发器 定义 代码 1.触发器命名有一定的规律 2.临时修改SQL语句的结束符 四.事务 事务的四大特性(ACID ...

  9. 二、typora软件的安装与markdown语法

    目录 一.typora软件的安装与使用 1.软件的安装 2.破解使用的方法 3.功能描述(markdown语法讲解) 标题 小标题 语言环境 表格 表情 图片 查看源代码 数学公式 流程图 高亮文本 ...

  10. 可迭代对象和迭代器对象以及for循环的本质

    目录 一.可迭代对象 二.迭代器对象 迭代器介绍: 迭代器对象: 迭代器对象的作用 迭代器对象实操: 注意事项 三.for循环的本质 一.可迭代对象 之前我们对于for循环为什么可以遍历没有做具体解释 ...