基于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如何实现excel数据添加到mongodb
Jul 30 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
python中in在list和dict中查找效率的对比分析
May 04 Python
PyTorch线性回归和逻辑回归实战示例
May 22 Python
对python sklearn one-hot编码详解
Jul 10 Python
python实现zabbix发送短信脚本
Sep 17 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
django orm模块中的 is_delete用法
May 20 Python
增大python字体的方法步骤
Jul 05 Python
python归并排序算法过程实例讲解
Nov 04 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 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安装memcache扩展的步骤讲解
2019/02/14 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
js语法学习之判断一个对象是否为数组
2014/05/13 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
AngularJS入门教程之表单校验用法示例
2016/11/02 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
Python 实现删除某路径下文件及文件夹的实例讲解
2018/04/24 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
Python使用itertools模块实现排列组合功能示例
2018/07/02 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
医院门卫岗位职责
2013/12/30 职场文书
教师党员思想汇报
2014/01/06 职场文书
红头文件任命书范本
2014/06/05 职场文书
2014年减负工作总结
2014/12/10 职场文书
市场总监岗位职责
2015/02/11 职场文书
教师读书笔记
2015/06/29 职场文书
毕业生入职感言
2015/07/31 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python