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

首先是那个爬虫的地址:

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

选择工具:

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

明确需求:

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

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

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

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

  1. # -*- coding:utf-8 -*-
  2. '''
  3. 该软件一共有四个类:
  4. 0、继承QPushButton的Mybutton类,主要是为了实现发送参数的clicked事件。
  5. 1、MainChapter类,显示主界面
  6. 2、BookMark类,负责MainChapter类和Chapter类之间的通信,是实现书签的关键类。
  7. 3、Chapter类,负责显示图片
  8. 类之间的通信:
  9. MainChapter to BookMark :章节 + 页数。如果不点击书签而点击章节,则默认页数为0
  10. BookMark to Chapter : 图片路径 + 章节 + 页。为了防止当前页面越界,除了发送图片路径给Chapter,还需要发送页面值给Chapter
  11. Chapter to BookMark : 章节 + 页。向BookMark请求对应章节 + 页的图片路径。
  12. Chapter to MainChapter : 隐藏自己后,通知MainChapter现身
  13.  
  14. 为了实现书签功能所搭建的复杂信号通信终于实现完成。。怀念第一个版本的简单粗暴
  15. 过几天在搞书签 OMG
  16. '''
  17. from PyQt4.QtGui import *
  18. from PyQt4.QtCore import *
  19. import sys
  20. import os
  21.  
  22. manhuadir = r'd:/sketdance'
  23. manhuainx = os.listdir(manhuadir)
  24. manhuainx = [key.decode('gbk') for key in manhuainx]
  25.  
  26. class MyButton(QPushButton):
  27. myclicked = pyqtSignal(int)
  28. def __init__(self,id,*args, **kwargs):
  29. super(MyButton,self).__init__(*args, **kwargs)
  30. self.id = id
  31.  
  32. self.connect(self,SIGNAL('clicked()'),self.emitMyclicked)
  33.  
  34. def emitMyclicked(self):
  35. self.myclicked.emit(self.id)
  36.  
  37. class BookMark(QWidget):
  38. sendAddr = pyqtSignal(QString,int,int)
  39. #senddir = QtCore.pyqtSignal(str)
  40. def __init__(self,parent = None):
  41. super(BookMark,self).__init__(parent)
  42. self.nowChapter = 0
  43. self.nowPage = 0
  44. self.flag = 0 # 这里写的太丑了。为了效率,setDictReady应该尽可能少的执行,因此标记下第一次执行setDictReady的情况
  45.  
  46. def connectToChapter(self,chapter):
  47. self.chapter = chapter
  48. self.connect(self,SIGNAL('sendAddr(QString,int,int)'),self.chapter.setChapterPage)
  49. #self.connect(self,SIGNAL('senddir(str)'),self.chapter.showImg)
  50.  
  51. def cmp(self,str1,str2):
  52. inx1 = str1.find('.')
  53. inx2 = str2.find('.')
  54. str1 = str1[:inx1]
  55. str2 = str2[:inx2]
  56. str1 = int(str1)
  57. str2 = int(str2)
  58. return str1 - str2
  59.  
  60. def setDictReady(self):
  61. self.dir = manhuainx[self.nowChapter]
  62. self.imgList = os.listdir(manhuadir + '/' + self.dir.encode('gbk'))
  63. self.imgList.sort(self.cmp)
  64.  
  65. def setChapterPage(self,page,chapter):
  66. self.nowPage = page
  67. if self.flag == 0: # 执行本应该在构造函数中执行的代码
  68. self.flag = 1
  69. self.setDictReady()
  70. if self.nowChapter != chapter: # 如果不需要更改当前文件夹,则不重新设置工作目录
  71. self.nowChapter = chapter
  72. self.setDictReady()
  73. self.target = self.generateAddr(page,chapter)
  74.  
  75. self.sendAddr.emit(QString(self.target),self.nowPage,self.nowChapter)
  76.  
  77. def generateAddr(self,page,chapter):
  78. if page > len(self.imgList):
  79. self.nowChapter += 1
  80. if self.nowChapter > len(manhuainx):
  81. self.nowChapter = 0
  82. self.nowPage = 0
  83. self.setDictReady()
  84. elif page < 0:
  85. self.nowPage = 0
  86. if chapter > 1:
  87. self.nowChapter = chapter - 1
  88. else:
  89. self.nowChapter = 0
  90. self.setDictReady()
  91. else:
  92. self.nowPage = page
  93. return manhuadir + '/' + self.dir + '/' + self.imgList[self.nowPage]
  94.  
  95. class MainChapters(QWidget):
  96. addrSignal = pyqtSignal(int,int)
  97. def __init__(self,parent = None):
  98. super(MainChapters,self).__init__(parent)
  99.  
  100. self.resize(640,480)
  101. self.button = [MyButton(inx,key,self) for inx,key in enumerate(manhuainx)]
  102. for inx,key in enumerate(self.button):
  103. self.connect(key,SIGNAL('myclicked(int)'),self.emitAddr)
  104. layout = QGridLayout()
  105. count = 0
  106. startX = 0
  107. for inx,key in enumerate(self.button):
  108. layout.addWidget(key,startX,inx % 7)
  109. count += 1
  110. if count >= 7:
  111. count = 0
  112. startX += 1
  113. self.setWindowTitle('imanhuaReader')
  114. self.setLayout(layout)
  115.  
  116. def connectToBook(self,bookmark):
  117. self.bookmark = bookmark
  118. self.connect(self,SIGNAL('addrSignal(int,int)'),self.bookmark.setChapterPage)
  119.  
  120. def emitAddr(self,id):
  121. self.hide()
  122. self.addrSignal.emit(0,id)
  123.  
  124. class Chapter(QWidget):
  125. getTarget = pyqtSignal(int,int)
  126. ret2Main = pyqtSignal()
  127. def __init__(self,parent = None):
  128. super(Chapter,self).__init__(parent)
  129. self.resize(1024,768)
  130. self.button = QPushButton(u'主界面',self)
  131. self.nextPa = QPushButton(u'下一页',self)
  132. self.prePa = QPushButton(u'上一页',self)
  133. self.imgScrol = QScrollArea(self)
  134. self.imgLabel = QLabel(self.imgScrol)
  135.  
  136. self.imgScrol.setWidget(self.imgLabel)
  137. self.imgScrol.setWidgetResizable(True) # 关键!否则不能正常显示
  138.  
  139. layout = QGridLayout(self)
  140. layout.addWidget(self.button,1,1)
  141. layout.addWidget(self.nextPa,1,0)
  142. layout.addWidget(self.prePa,1,2)
  143. layout.addWidget(self.imgScrol,0,0)
  144. self.setLayout(layout)
  145.  
  146. def connectToMain(self,mainChapter):
  147. self.mainChapter = mainChapter
  148. self.connect(self.button,SIGNAL('clicked()'),self.returnToMain)
  149. self.connect(self,SIGNAL('ret2Main()'),mainChapter.show)
  150.  
  151. def connectToBook(self,bookmark):
  152. self.bookmark = bookmark
  153. self.connect(self.nextPa,SIGNAL('clicked()'),self.nextImg) # 信号不能重复连接!否则会发两个
  154. self.connect(self.prePa,SIGNAL('clicked()'),self.preImg)
  155. self.connect(self,SIGNAL('getTarget(int,int)'),self.bookmark.setChapterPage)
  156.  
  157. def showImg(self):
  158. self.target = unicode(self.target)
  159. pixmap = QPixmap(self.target)
  160. self.imgLabel.setPixmap(pixmap)
  161.  
  162. def setChapterPage(self,target,page,chapter):
  163. self.showMaximized()
  164. self.chapter = chapter
  165. self.page = page
  166. self.target = target
  167. self.showImg()
  168.  
  169. def nextImg(self):
  170. self.page += 1 # 越界在BookMark中处理
  171. self.getTarget.emit(self.page,self.chapter)
  172.  
  173. def preImg(self):
  174. self.page -= 1
  175. self.getTarget.emit(self.page,self.chapter)
  176.  
  177. def returnToMain(self):
  178. self.ret2Main.emit()
  179. self.hide()
  180.  
  181. app = QApplication(sys.argv)
  182. main = MainChapters()
  183. chap = Chapter()
  184. book = BookMark()
  185. chap.connectToMain(main)
  186. chap.connectToBook(book)
  187. main.connectToBook(book)
  188. book.connectToChapter(chap)
  189. main.show()
  190. 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. chrome查看headers

    F12-> network标签, 刷新网页-> 找到该网页url,选择headers

  2. elf格式分析

    近期研究了一下elf文件格式,发现好多资料写的都比較繁琐,可能会严重打击学习者的热情,我把自己研究的结果和大家分享,希望我的描写叙述可以简洁一些. 一.基础知识 elf是一种文件格式,用于存储Linu ...

  3. Linux实现字符设备驱动的基础步骤

    Linux应用层想要操作kernel层的API,比方想操作相关GPIO或寄存器,能够通过写一个字符设备驱动来实现. 1.先在rootfs中的 /dev/ 下生成一个字符设备.注意主设备号 和 从设备号 ...

  4. Codeforces Round #296 (Div. 2) A B C D

    A:模拟辗转相除法时记录答案 B:3种情况:能降低2,能降低1.不能降低分别考虑清楚 C:利用一个set和一个multiset,把行列分开考虑.利用set自带的排序和查询.每次把对应的块拿出来分成两块 ...

  5. Enum的简单了解

    Enum可以将一组具名的有限集合创建成一种新的类型,而这些具名的值可以作为常规的程序组件使用. 在创建enum时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum,所以enum本 ...

  6. Linux目录文件详解FHS标准(2013.09.05)

    Linux 目录配置的依据FHS(Filesystem Hierarchy Standard)标准,将目录分成为四种交互作用的形态: 四种形态的具体解释: 可分享的:可以分享给其他系统挂载使用的目录, ...

  7. Java 模拟队列(一般队列、双端队列、优先级队列)

    队列: 先进先出,处理类似排队的问题,先排的.先处理,后排的等前面的处理完了,再处理 对于插入和移除操作的时间复杂度都为O(1).从后面插入,从前面移除 双端队列: 即在队列两端都能够insert和r ...

  8. WorkFlow介绍及用法

    WorkFlow介绍及用法 说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配 ...

  9. 华为C8816电信版ROOT过程

    华为C8816电信版ROOT方法, 网上的方法都不太靠谱.. 昨天弄了好久, 最终搞定.. 整理了一下.. 实用到的就方便多了. <方法不再啰嗦, 都有说明> 1. 获取手机解锁passw ...

  10. Linux Server

    Linux Server CentOS 6.3下配置iSCSI网络存储 摘要: 一.简介iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运 ...