学习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. [OpenCV实战]50 用OpenCV制作低成本立体相机

    本文主要讲述利用OpenCV制作低成本立体相机以及如何使用OpenCV创建3D视频,准确来说是模仿双目立体相机,我们通常说立体相机一般是指双目立体相机,就是带两个摄像头的那种(目就是指眼睛,双目就是两 ...

  2. C#调用接口的简单流程

    1.编写url地址 string url="http://192.168"; 2.创建http请求对象 HttpWebRequest request = (HttpWebReque ...

  3. [数据结构]克鲁斯卡尔(Kruskal)算法

    算法的概念 与Prim算法从顶点开始扩展最小生成树不同,Kruskal算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法.假设N=(V,E)是连通网,对应的最小生成树T=(Vt,Et),Kr ...

  4. [cocos2d-x]我发现的内存管理机制的一些问题

    之前看过的一些文章中关于内存的管理机制讲的非常好,但是我发现它们在谈到每一帧都会创建一个新的内存池的时候,我发现源码并不是这样: PoolManager* PoolManager::getInstan ...

  5. 可持久化栈学习笔记 | 题解 P6182 [USACO10OPEN]Time Travel S

    简要题意 你需要维护一个栈,有 \(n\) 个操作,支持: 给定一个 \(x\),将 \(x\) 加入栈. 将一个元素出栈. 给定一个 \(x\),将当前栈回退到 第 \(x\) 操作前. 每一次操作 ...

  6. 通过Terraform创建GCP Pubsub

    1 简介 Terraform是管理许多平台的基础设施的工具,如AWS.GCP和Azure.这篇文章将讲解如何通过Terraform来管理GCP Pub/Sub. 创建GCP项目请参考:初始化一个GCP ...

  7. 自定义alert弹框,去掉IP以及端口号提示

    最新版例子~~  如果同时多个弹框,只显示第一个 <!DOCTYPE html> <html lang="en"> <head> <met ...

  8. python开发简单的命令行工具

    介绍 Python模块argparse,这是一个命令行选项,参数和子命令的解释器,使用该模块可以编写友好的命令行工具,在程序中定义好需要的参数,argparse将弄清楚如何解析 sys.argv中的参 ...

  9. Node.js学习笔记----day04之学生信息管理系统

    认真学习,认真记录,每天都要有进步呀!!! 加油叭!!! 一.起步 项目结构 安装需要的包 初始化显示index.html index.html var express = require('expr ...

  10. Pytest插件之pytest-base-url切换测试环境

    Pytest插件之pytest-base-url切换测试环境 安装  pip install pytest-base-url 应用场景 利用参数--base-url或者配置(pytest.ini中ba ...