博客园的第一个坑,想想都有点小激动 =3=

首先是那个爬虫的地址:

【原创】最近写的一个比较hack的小爬虫

选择工具:

以前用过Qt,那么选pyqt4也就是情理之中了。

明确需求:

0、首先,要读取漫画的全部章节进来,同时能选择相应的章节。

1、其次,进入相应的章节后,显示该章节的图片,同时有“下一页”、“上一页”、“返回主界面”等基本功能

3、最后,最好能有书签功能。程序应该能够根据章节和页码的信息定位相应的图片

最后是还没有来得及实现书签的代码:

# -*- coding:utf-8 -*-
'''
该软件一共有四个类:
0、继承QPushButton的Mybutton类,主要是为了实现发送参数的clicked事件。
1、MainChapter类,显示主界面
2、BookMark类,负责MainChapter类和Chapter类之间的通信,是实现书签的关键类。
3、Chapter类,负责显示图片
类之间的通信:
MainChapter to BookMark :章节 + 页数。如果不点击书签而点击章节,则默认页数为0
BookMark to Chapter : 图片路径 + 章节 + 页。为了防止当前页面越界,除了发送图片路径给Chapter,还需要发送页面值给Chapter
Chapter to BookMark : 章节 + 页。向BookMark请求对应章节 + 页的图片路径。
Chapter to MainChapter : 隐藏自己后,通知MainChapter现身 为了实现书签功能所搭建的复杂信号通信终于实现完成。。怀念第一个版本的简单粗暴
过几天在搞书签 OMG
'''
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
import os manhuadir = r'd:/sketdance'
manhuainx = os.listdir(manhuadir)
manhuainx = [key.decode('gbk') for key in manhuainx] class MyButton(QPushButton):
myclicked = pyqtSignal(int)
def __init__(self,id,*args, **kwargs):
super(MyButton,self).__init__(*args, **kwargs)
self.id = id self.connect(self,SIGNAL('clicked()'),self.emitMyclicked) def emitMyclicked(self):
self.myclicked.emit(self.id) class BookMark(QWidget):
sendAddr = pyqtSignal(QString,int,int)
#senddir = QtCore.pyqtSignal(str)
def __init__(self,parent = None):
super(BookMark,self).__init__(parent)
self.nowChapter = 0
self.nowPage = 0
self.flag = 0 # 这里写的太丑了。为了效率,setDictReady应该尽可能少的执行,因此标记下第一次执行setDictReady的情况 def connectToChapter(self,chapter):
self.chapter = chapter
self.connect(self,SIGNAL('sendAddr(QString,int,int)'),self.chapter.setChapterPage)
#self.connect(self,SIGNAL('senddir(str)'),self.chapter.showImg) def cmp(self,str1,str2):
inx1 = str1.find('.')
inx2 = str2.find('.')
str1 = str1[:inx1]
str2 = str2[:inx2]
str1 = int(str1)
str2 = int(str2)
return str1 - str2 def setDictReady(self):
self.dir = manhuainx[self.nowChapter]
self.imgList = os.listdir(manhuadir + '/' + self.dir.encode('gbk'))
self.imgList.sort(self.cmp) def setChapterPage(self,page,chapter):
self.nowPage = page
if self.flag == 0: # 执行本应该在构造函数中执行的代码
self.flag = 1
self.setDictReady()
if self.nowChapter != chapter: # 如果不需要更改当前文件夹,则不重新设置工作目录
self.nowChapter = chapter
self.setDictReady()
self.target = self.generateAddr(page,chapter) self.sendAddr.emit(QString(self.target),self.nowPage,self.nowChapter) def generateAddr(self,page,chapter):
if page > len(self.imgList):
self.nowChapter += 1
if self.nowChapter > len(manhuainx):
self.nowChapter = 0
self.nowPage = 0
self.setDictReady()
elif page < 0:
self.nowPage = 0
if chapter > 1:
self.nowChapter = chapter - 1
else:
self.nowChapter = 0
self.setDictReady()
else:
self.nowPage = page
return manhuadir + '/' + self.dir + '/' + self.imgList[self.nowPage] class MainChapters(QWidget):
addrSignal = pyqtSignal(int,int)
def __init__(self,parent = None):
super(MainChapters,self).__init__(parent) self.resize(640,480)
self.button = [MyButton(inx,key,self) for inx,key in enumerate(manhuainx)]
for inx,key in enumerate(self.button):
self.connect(key,SIGNAL('myclicked(int)'),self.emitAddr)
layout = QGridLayout()
count = 0
startX = 0
for inx,key in enumerate(self.button):
layout.addWidget(key,startX,inx % 7)
count += 1
if count >= 7:
count = 0
startX += 1
self.setWindowTitle('imanhuaReader')
self.setLayout(layout) def connectToBook(self,bookmark):
self.bookmark = bookmark
self.connect(self,SIGNAL('addrSignal(int,int)'),self.bookmark.setChapterPage) def emitAddr(self,id):
self.hide()
self.addrSignal.emit(0,id) class Chapter(QWidget):
getTarget = pyqtSignal(int,int)
ret2Main = pyqtSignal()
def __init__(self,parent = None):
super(Chapter,self).__init__(parent)
self.resize(1024,768)
self.button = QPushButton(u'主界面',self)
self.nextPa = QPushButton(u'下一页',self)
self.prePa = QPushButton(u'上一页',self)
self.imgScrol = QScrollArea(self)
self.imgLabel = QLabel(self.imgScrol) self.imgScrol.setWidget(self.imgLabel)
self.imgScrol.setWidgetResizable(True) # 关键!否则不能正常显示 layout = QGridLayout(self)
layout.addWidget(self.button,1,1)
layout.addWidget(self.nextPa,1,0)
layout.addWidget(self.prePa,1,2)
layout.addWidget(self.imgScrol,0,0)
self.setLayout(layout) def connectToMain(self,mainChapter):
self.mainChapter = mainChapter
self.connect(self.button,SIGNAL('clicked()'),self.returnToMain)
self.connect(self,SIGNAL('ret2Main()'),mainChapter.show) def connectToBook(self,bookmark):
self.bookmark = bookmark
self.connect(self.nextPa,SIGNAL('clicked()'),self.nextImg) # 信号不能重复连接!否则会发两个
self.connect(self.prePa,SIGNAL('clicked()'),self.preImg)
self.connect(self,SIGNAL('getTarget(int,int)'),self.bookmark.setChapterPage) def showImg(self):
self.target = unicode(self.target)
pixmap = QPixmap(self.target)
self.imgLabel.setPixmap(pixmap) def setChapterPage(self,target,page,chapter):
self.showMaximized()
self.chapter = chapter
self.page = page
self.target = target
self.showImg() def nextImg(self):
self.page += 1 # 越界在BookMark中处理
self.getTarget.emit(self.page,self.chapter) def preImg(self):
self.page -= 1
self.getTarget.emit(self.page,self.chapter) def returnToMain(self):
self.ret2Main.emit()
self.hide() app = QApplication(sys.argv)
main = MainChapters()
chap = Chapter()
book = BookMark()
chap.connectToMain(main)
chap.connectToBook(book)
main.connectToBook(book)
book.connectToChapter(chap)
main.show()
app.exec_()

  

应该加入个临时书签的功能,也就是退出后,如果是章节B页面13,那么下次再进入程序时也是章节B页面13

【Python项目】配合爱漫画爬取漫画脚本而设计的GUI漫画阅读器 (一)的更多相关文章

  1. Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  2. 【学习笔记】Python 3.6模拟输入并爬取百度前10页密切相关链接

    [学习笔记]Python 3.6模拟输入并爬取百度前10页密切相关链接 问题描述 通过模拟网页,实现百度搜索关键词,然后获得网页中链接的文本,与准备的文本进行比较,如果有相似之处则代表相关链接. me ...

  3. Python爬虫:为什么你爬取不到网页数据

    前言: 之前小编写了一篇关于爬虫为什么爬取不到数据文章(文章链接为:Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章), 但是当时小编也是胡乱编写的,其实里面有很多问题的,现在小编重新发 ...

  4. Python爬虫实战二之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...

  5. 转 Python爬虫实战二之爬取百度贴吧帖子

    静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...

  6. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

  7. python爬虫学习01--电子书爬取

    python爬虫学习01--电子书爬取 1.获取网页信息 import requests #导入requests库 ''' 获取网页信息 ''' if __name__ == '__main__': ...

  8. python爬虫:了解JS加密爬取网易云音乐

    python爬虫:了解JS加密爬取网易云音乐 前言 大家好,我是"持之以恒_liu",之所以起这个名字,就是希望我自己无论做什么事,只要一开始选择了,那么就要坚持到底,不管结果如何 ...

  9. 【python3】爬取鼠绘汉化的海贼王漫画

    特别说明: 因为早些时候鼠绘的接口调整,之前的代码已经不能用了. 正好最近在学习scrapy,于是重新写了一个,项目放在github  https://github.com/TurboWay/ishu ...

随机推荐

  1. expression:stream!=NULL

    如果fopen()后返回的是NULL:就不能调用fclose()了: 用fopen()获得的文件句柄不是NULL,那么就需要用fclose()来关闭它.如果是NULL则不需要 null就表示你打开文件 ...

  2. 搭建自己的XenServer+CloudStack云平台,提供IaaS服务(一)环境搭建

    目标 搭建一个完整的基于XenServer和CloudStack的虚拟化平台,提供IaaS服务. 搭建三台安装了XenServer的服务器 搭建一台安装了CloudStack的服务器用以管理云平台 搭 ...

  3. python基础教程_学习笔记10:异常

    异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.假设异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止运行: >>> ...

  4. oracle 12c 中asm元数据是否有所变化

    详见原文博客链接地址: oracle 12c 中asm元数据是否有所变化

  5. php设计模式——UML类图

    前言 用php开发两年多了,准备也写一下平时常用的设计模式,都是基于自己的实践经验,当然,用设计模式之前首先要看懂设计模式,因此这里首先讲解一下UML类图.通过UML类图,能更好的和大家交流,也能很容 ...

  6. 内存级别/栅栏 ( Memory Barriers / Fences ) – 翻译

    翻译自:Martin Thompson – Memory Barriers/Fences 在这篇文章里,我将讨论并发编程里最基础的技术–以内存关卡或栅栏著称.那让进程内的内存状态对其它进程可见. CP ...

  7. hdu2125(数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2125 题意:N×M的网格其中有一条边坏掉了,问从起点到终点的放法数. 分析:数学公式 如果没有坏边的话 ...

  8. Hdu 4539 【状态DP】.cpp

    题意: 一个炮兵可以攻打和他之间曼哈顿距离为2的士兵,给出你一块n*m的战场,告诉你哪些地方可以站人哪些地方不可以,问你最多可以安放多少个士兵? n <= 100, m <= 10 思路: ...

  9. Uva10290 - {Sum+=i++} to Reach N

    Problem H {sum+=i++} to Reach N Input: standard input Output:  standard output Memory Limit: 32 MB A ...

  10. SRM 219 Div II Level One: WaiterTipping,小心约分

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12609&rd=15503 这题目看上去so easy, ...