基于PyQT5制作一个桌面摸鱼工具


Posted in Python onFebruary 15, 2022

前言

现在我能一整天都严肃地盯着屏幕,看起来就像在很认真地工作,

利用摸鱼,打开小说,可实行完美摸鱼,实时保存进度

用PYQT5 Mock一个摸鱼软件 类似于Thief

按键功能控制

q 退出

B 书签功能

F 增加字体大小

Shift F 减小字体

O 打开文件,现在仅仅支持 utf8格式的txt文件

主要功能

FlameLess Window 无边框窗口

一键快速退出

ini 文件读写

右键上下文菜单

核心代码

pyqt 实现功能还是比较顺畅的,总体功能实现代码量不到200行

from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
import sys,os
import configparser

# Q to quit app
# B Bookmark 
# F increase Font size 
# Shift F decrease Font size
# O Open *.txt file

class FisherReader(QMainWindow):
	def __init__(self):
		super().__init__()
		
		# drag
		self.pos =[0,0]
		self.mouse_down = False
		self.down = [0,0]
		self.prev = [0,0]
		# text
		self.txtName = ''
		self.text = []
		self.index = 0
		# style
		self.show_info = False
		self.font_size = 8
		self.bgColor = QColor(255,255,255)
		self.defPalette()
		# self.read_Txt()

	def mousePressEvent(self, event):
		current = [event.pos().x(),event.pos().y()]
		self.down = current
		self.mouse_down = True

	def mouseMoveEvent(self,event):
		current = [event.pos().x(),event.pos().y()]
		if self.mouse_down:
			delta = [current[0]-self.down[0],current[1]-self.down[1]]
			new = [self.pos[0]+delta[0],self.pos[1]+delta[1]]
			self.move(new[0],new[1])
			self.pos = new
			# print(self.pos)
			self.prev = current

	def mouseReleaseEvent(self, event):
		self.mouse_down = False

	def keyPressEvent(self,event):
		if event.key() == Qt.Key_Q:
			app.quit()
		if event.key() == Qt.Key_Down:
			if self.index < len(self.text)-1:
				self.index = self.index+1
				self.update()
		if event.key() == Qt.Key_Up:
			if self.index > 0:
				self.index = self.index-1
				self.update()
		if event.key() == Qt.Key_F:
			if event.modifiers() & QtCore.Qt.ShiftModifier and self.font_size >2:
				self.font_size -= 2
			else:
				self.font_size += 2
			self.update()
		if event.key() == Qt.Key_I:
			self.show_info = not self.show_info
			self.update()
		if event.key() == Qt.Key_O:
			self.open()
			self.update()
		if event.key() == Qt.Key_B:
			self.addBookmark()
		if event.key() == Qt.Key_R:
			self.getBookmark()
			

	def defPalette(self):
		p = self.palette()
		p.setColor(QPalette.Background,self.bgColor)
		self.window().setPalette(p)

	def paintEvent(self,event):
		painter = QPainter(self)
		painter.setRenderHints(QPainter.Antialiasing)
		if len(self.text)>0:
			painter.setFont(QFont('SimSun',self.font_size))
			painter.drawText(QtCore.QRectF(10,10,600,50),Qt.AlignLeft,self.text[self.index])

			if self.show_info:
				painter.drawText(QtCore.QRectF(610,10,50,50),Qt.AlignLeft,"{}/{}".format(self.index+1,len(self.text)))

	def open(self):
		path, _ = QFileDialog.getOpenFileName(self, "打开文件",os.getcwd(), "Text files (*.txt)")

		if path:
			self.txtName = path
			self.read_Txt_smart(path)
			self.update()

	def read_Txt(self,file):
		with open(file,'r',encoding="UTF-8") as f:
			self.text = f.readlines()

	def cut(self,text,length):
		return [text[i:i+length] for i in range(0,len(text),length)]

	def wheelEvent(self, e):
		if e.angleDelta().y() < 0:
			if self.index < len(self.text)-1:
				self.index = self.index+1
		elif e.angleDelta().y() > 0:
			if self.index > 0:
				self.index = self.index-1
		self.update()  

	def addBookmark(self):
		config = configparser.ConfigParser()
		path = "bookmark.ini"

		config.add_section('bookmark')
		config.set('bookmark','path',self.txtName)
		config.set('bookmark','bookmark',str(self.index))
		config.write(open(path,'w'))

	def getBookmark(self):
		config = configparser.ConfigParser()
		path = "bookmark.ini"
		config.read(path)

		if config.has_option('bookmark','path'):
			self.txtName = config.get('bookmark','path')
			self.index = int(config.get('bookmark','bookmark'))
			self.read_Txt_smart(self.txtName);
			self.update()


	def read_Txt_smart(self,file):
		with open(file,'r',encoding="UTF-8") as f:
			text_buffer = []
			lines = f.readlines()
			for line in lines:
				cline = self.cut(line,30)
				for cl in cline:
					if len(cl)>1:
						text_buffer.append(cl)
			self.text = text_buffer

if __name__ == '__main__':
	app = QApplication(sys.argv)
	fisher = FisherReader()
	fisher.resize(660,45)
	fisher.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint)
	fisher.show()
	fisher.setWindowTitle("小鱼")
	sys.exit(app.exec_())

到此这篇关于基于PyQT5制作一个桌面摸鱼工具的文章就介绍到这了,更多相关PyQT5桌面摸鱼工具内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中使用PyHook监听鼠标和键盘事件实例
Jul 18 Python
开源Web应用框架Django图文教程
Mar 09 Python
让Python更加充分的使用Sqlite3
Dec 11 Python
django 解决manage.py migrate无效的问题
May 27 Python
Python如何发布程序的详细教程
Oct 09 Python
python对象与json相互转换的方法
May 07 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
python 求10个数的平均数实例
Dec 16 Python
Python 使用threading+Queue实现线程池示例
Dec 21 Python
TensorFlow——Checkpoint为模型添加检查点的实例
Jan 21 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
python接口测试返回数据为字典取值方式
Feb 12 #Python
Python socket如何解析HTTP请求内容
Feb 12 #Python
python全面解析接口返回数据
Feb 12 #Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 #Python
python中出现invalid syntax报错的几种原因分析
Feb 12 #Python
python ConfigParser库的使用及遇到的坑
Feb 12 #Python
Python制作春联的示例代码
Jan 22 #Python
You might like
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
js中设置元素class的三种方法小结
2011/08/28 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
纯js实现的积木(div层)拖动功能示例
2017/07/19 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
Python Map 函数的使用
2020/08/28 Python
如何使用Pytorch搭建模型
2020/10/26 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
英国手机零售商:Metrofone
2019/03/18 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
优秀中学生事迹材料
2014/01/31 职场文书
合作协议书范本
2014/04/17 职场文书
学生吸烟检讨书
2014/09/14 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书