基于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网络编程之读取网站根目录实例
Sep 30 Python
Python获取当前路径实现代码
May 08 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
Python日期的加减等操作的示例
Aug 15 Python
TensorFlow损失函数专题详解
Apr 26 Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 Python
Python笔记之工厂模式
Nov 20 Python
AUC计算方法与Python实现代码
Feb 28 Python
python pandas移动窗口函数rolling的用法
Feb 29 Python
Django 如何实现文件上传下载
Apr 08 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 Python
python如何将mat文件转为png
Jul 15 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 接口类与抽象类的实际作用
2009/11/26 PHP
PHP类的特性实例分析
2016/09/28 PHP
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
微信小程序canvas动态时钟
2020/10/22 Javascript
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
快速入手Python字符编码
2016/08/03 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
python监控进程脚本
2018/04/12 Python
python读写csv文件实例代码
2019/07/05 Python
Numpy的简单用法小结
2019/08/28 Python
Django之路由层的实现
2019/09/09 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
python中的错误如何查看
2020/07/08 Python
Django日志及中间件模块应用案例
2020/09/10 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
高二生物教学反思
2014/01/27 职场文书
社区志愿者活动方案
2014/08/18 职场文书
法定代表人身份证明书
2014/09/10 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
个人典型事迹材料
2014/12/30 职场文书
生日答谢词
2015/01/05 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
Python天气语音播报小助手
2021/09/25 Python