基于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 不同对象比较大小示例探讨
Aug 21 Python
Python Web框架Tornado运行和部署
Oct 19 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
django站点管理详解
Dec 12 Python
python ansible服务及剧本编写
Dec 29 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
Jul 12 Python
python获取引用对象的个数方式
Dec 20 Python
Python 统计位数为偶数的数字代码详解
Mar 15 Python
Python包和模块的分发详细介绍
Jun 19 Python
python实现登录与注册系统
Nov 30 Python
python给list排序的简单方法
Dec 10 Python
Python matplotlib绘制雷达图
Apr 13 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
JQuery与iframe交互实现代码
2009/12/24 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
浅谈mvvm-simple双向绑定简单实现
2018/04/18 Javascript
webpack项目轻松混用css module的方法
2018/06/12 Javascript
Python字符串格式化输出方法分析
2016/04/13 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
python中验证码连通域分割的方法详解
2018/06/04 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
Python 判断奇数偶数的方法
2018/12/20 Python
对python生成业务报表的实例详解
2019/02/03 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
Django 多环境配置详解
2019/05/14 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
如何利用python生成MD5并去重
2020/12/07 Python
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
全球最大的游戏市场:G2A
2018/07/05 全球购物
上海微创软件面试题
2012/06/14 面试题
解决方案设计综合面试题
2015/08/31 面试题
文明青少年标兵事迹材料
2014/01/28 职场文书
三个儿子教学反思
2014/02/03 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
Python开发五子棋小游戏
2022/04/28 Python