網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
現(xiàn)在我能一整天都嚴(yán)肅地盯著屏幕,看起來(lái)就像在很認(rèn)真地工作,
利用摸魚(yú),打開(kāi)小說(shuō),可實(shí)行完美摸魚(yú),實(shí)時(shí)保存進(jìn)度
用PYQT5 Mock一個(gè)摸魚(yú)軟件 類似于Thief
按鍵功能控制
q 退出
B 書(shū)簽功能
F 增加字體大小
Shift F 減小字體
O 打開(kāi)文件,現(xiàn)在僅僅支持 utf8格式的txt文件
主要功能
FlameLess Window 無(wú)邊框窗口
一鍵快速退出
ini 文件讀寫(xiě)
右鍵上下文菜單
核心代碼
pyqt 實(shí)現(xiàn)功能還是比較順暢的,總體功能實(shí)現(xiàn)代碼量不到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, "打開(kāi)文件",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("小魚(yú)") sys.exit(app.exec_())
原文鏈接:https://blog.csdn.net/weixin_45634056/article/details/122906211
相關(guān)推薦
- 2022-10-04 python編寫(xiě)一個(gè)GUI倒計(jì)時(shí)器_python
- 2022-04-12 分享幾種python?變量合并方法_python
- 2023-08-01 elementui全局給select option添加title屬性
- 2023-03-22 Python中數(shù)值比較的效率_python
- 2022-05-01 python中NumPy的安裝與基本操作_python
- 2022-05-13 python實(shí)現(xiàn)簡(jiǎn)易圖書(shū)管理系統(tǒng)_python
- 2022-04-15 SpringBoot系列之MongoDB?Aggregations用法詳解_MongoDB
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支