Skip to content

Commit

Permalink
正式版本发布,全面拥抱 cefpython3
Browse files Browse the repository at this point in the history
  • Loading branch information
DoooReyn committed Oct 22, 2022
1 parent da9c5d3 commit dc824dc
Show file tree
Hide file tree
Showing 42 changed files with 15,008 additions and 14,671 deletions.
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# 更新说明

## WxReader 2.0.0 [2022/10/22]

- 全新的 WebView 方案
- Qt WebEngine 存在严重的性能问题,本轮优化已完全弃用
- cefpython3 在此方面表现非常优异,大幅提升了阅读体验
- 工具栏调整
- 删除"静默"
- "固定"修改为"收起",并绑定快捷键 F6
- 顺序调整
- 悬停时提示加上了快捷键
- 快捷键调整
- 删除工具栏"静默"动作对应的 Esc
- 首页从 F3 调整为 F4
- F3 分配给"赞助"
- 系统托盘图标行为反馈
- 单击或双击将激活主窗口
- 右击不会激活主窗口
- 状态栏调整
- "页面加载进度条" 修改为 "显示当前页面地址"

## WxReader 2.0.0-beta.2 [2022/10/18]

- 升级引擎到 PySide6,主要解决 Qt WebEngine 内存占用问题
- 新增安装包
- 更新便携版
- 对包体进行了精简优化
- 更新 LICENSE

## WxReader 2.0.0-beta [2022/10/11]

- 微读自动阅读器 2.0.0 推出啦! 首个包是未删减、无压缩的便携版。
- 因为 Qt 的 WebEngine 动态库体积比较大,所以包整体体积也不小。
- 后续会尝试通过不同手段来优化一下包体,敬请期待。
2 changes: 1 addition & 1 deletion Questions.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 记录开发中遇到的一些问题
# 记录开发中遇到的一些问题记录

- **无法解析的模块**
- 描述:在 Pycharm 下,`import` 进来的模块显示 unresolved 错误
Expand Down
105 changes: 78 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,43 +1,56 @@
### 一、前言
### 更新说明

**微读阅读器****2020.02.17**开始立项,出发点原本就是一个意外,但东西出来之后,意外地收到了很多朋友的喜欢和关注。
#### WxReader 2.0.0 [2022/10/22]

从最初的网页版,衍变到后来基于**Electron.js**开发的PC版问世,自此之后**微读阅读器**的版本就一直停留在**1.3.0**
因为它纯粹是我一时热血上头开发的一个小工具,所以不会让它太占用我的个人时间。
尽管后来收到了一些反馈和建议,但是 U Know,懒是阶段性的,热情下头之后就很难抬起手来继续了。
- 全新的 WebView 方案
- Qt WebEngine 存在严重的性能问题,本轮优化已完全弃用
- cefpython3 在此方面表现非常优异,大幅提升了阅读体验
- 工具栏调整
- 删除"静默"
- "固定"修改为"收起",并绑定快捷键 F6
- 顺序调整
- 悬停时提示加上了快捷键
- 快捷键调整
- 删除工具栏"静默"动作对应的 Esc
- 首页从 F3 调整为 F4
- F3 分配给"赞助"
- 系统托盘图标行为反馈
- 单击或双击将激活主窗口
- 右击不会激活主窗口
- 状态栏调整
- "页面加载进度条" 修改为 "显示当前页面地址"

如今,时隔两年半,收到了不少用户反馈之后,**微读阅读器2.0** 终于发布啦!
#### WxReader 2.0.0-beta.2 [2022/10/18]

相比 **1.3****2.0** 做了比较大的改进,主要包括:
- 升级引擎到 PySide6,主要解决 Qt WebEngine 内存占用问题
- 新增安装包
- 更新便携版
- 对包体进行了精简优化
- 更新 LICENSE

- 弃用 **Electron.js** 框架,改用 **PySide6** 作为底层支持;
- 所有操作都放在了工具栏,操作更加简单直接,大大提升用户体验;
- 修复大范围挂机暂停的问题:
- **1.3** 在切换页面之后就会进行滚动判定,如果内容未加载完毕,可能造成误判;**2.0** 只有当页面内容完全载入之后才会开启滚动;
- **1.3** 的页面滚动失效问题比较严重,**2.0** 使用应用级定时器来刷新滚动状态,目前测试来看还算比较稳定;
- 优化自动阅读时暂停的条件:选中文本、打开目录、打开评论;
- 增加速度、步幅设置,放宽速度限制;
- 增加全文阅读完成时发送 **GET** 请求的功能;
- **2.0**将完全开源,但未经允许禁止投入商业使用。
#### WxReader 2.0.0-beta [2022/10/11]

最后,**微读阅读器2.0**是基于 **PySide6** 全新开发的,整个过程差不多花了一周 _(因为国庆罢工啦)_,时间上是比较仓促的,
因此很可能还存在一些问题或体验上的不足,后续会陆续跟进维护,也欢迎大家到[官方仓库][1]提问题。
- 微读自动阅读器 2.0.0 推出啦! 首个包是未删减、无压缩的便携版。
- 因为 Qt 的 WebEngine 动态库体积比较大,所以包整体体积也不小。
- 后续会尝试通过不同手段来优化一下包体,敬请期待。

---

### 二、快捷键
### 快捷键

| 快捷键 | 说明 |
| 按键 | 说明 |
|------|----------|
| F1 | 打开帮助 |
| F2 | 打开关于 |
| F3 | 回到首页 |
| F3 | 打开赞助 |
| F4 | 回到首页 |
| F5 | 刷新页面 |
| F6 | 显示/隐藏工具栏 |
| F8 | 导出笔记 |
| F9 | 切换主题 |
| F10 | 自动阅读开关 |
| F10 | 切换自动阅读 |
| F11 | 切换全屏 |
| F12 | 更多选项 |
| F12 | 打开更多选项 |
| + | 加快滚动速度 |
| - | 降低滚动速度 |
| Home | 回到顶部 |
Expand All @@ -51,12 +64,50 @@

---

### 三、常见问题
### 问题反馈

- 如果碰到开启自动阅读之后页面没有反应的情况,可以尝试刷新一下页面,基本可以解决问题;
- 如有其他问题或建议,请到[官方仓库][1]进行讨论;
- 你也可以给我发邮件 **jl88744653@gmail.com**,但请确保主题是**我为微读提意见**,不然可能会被我过滤掉。
- 如有问题或建议,请到[官方仓库][1]进行讨论;
- 也可以给我发邮件 **jl88744653@gmail.com**,但请确保主题是**我为微读提意见**,不然可能会被我过滤掉。

[1]: https://github.com/DoooReyn/WxReader

[2]: https://github.com/DoooReyn/WxRead-PC-AutoReader

---

### 想说的话

**微读阅读器****2020.02.17**开始立项,出发点原本就是一个意外,但东西出来之后,意外地收到了很多朋友的喜欢和关注。

从最初的网页版,衍变到后来基于**Electron.js**开发的PC版问世,自此之后**微读阅读器**的版本就一直停留在**1.3.0**。 因为它纯粹是我一时热血上头开发的一个小工具,所以不会让它太占用我的个人时间。
尽管后来收到了一些反馈和建议,但是 U Know,懒是阶段性的,热情下头之后就很难抬起手来继续了。

如今,时隔两年半,收到了不少用户反馈之后,**微读阅读器2.0** 终于发布啦!

相比 **1.3****2.0** 做了比较大的改进,主要包括:

- 弃用 **Electron.js** 框架,改用 **PySide6** 作为底层支持;
- 所有操作都放在了工具栏,操作更加简单直接,大大提升用户体验;
- 修复大范围挂机暂停的问题:
- **1.3** 在切换页面之后就会进行滚动判定,如果内容未加载完毕,可能造成误判;
- **2.0** 只有当页面内容完全载入之后才会开启滚动;
- **1.3** 的页面滚动失效问题比较严重
- **2.0** 使用应用级定时器来刷新滚动状态,目前测试来看还算比较稳定;
- 优化自动阅读时暂停的条件:选中文本、打开目录、打开评论;
- 增加速度、步幅设置,放宽速度限制;
- 增加全文阅读完成时发送 **GET** 请求的功能;
- **2.0**将完全开源,但未经允许禁止投入商业使用。

最后,**微读阅读器2.0**是基于 **PySide6** 全新开发的,整个过程差不多花了一周 _(因为国庆罢工啦)_,时间上是比较仓促的, 因此很可能还存在一些问题或体验上的不足,后续会陆续跟进维护,也欢迎大家到[官方仓库][1]
提问题。

> **2022/10/22 更新**
>
> 新一轮优化弃用 QtWebEngine,全面拥抱性能极佳的 **cefpython3**,这次释放出的是正式版,欢迎大家体验!
>
---

### 写在最后

开发不易,请大家多多支持!😊
33 changes: 18 additions & 15 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,21 +35,24 @@
- 于是,想到可以在未压缩的目录下使用 `UPX` 压缩过的动态库文件,试了下还是可行的,唯一的缺点就是 `UPX` 处理过的运行起来有点慢

- [x] 内存泄漏问题
- 问题描述:每切换一次页面,内存占用只增不减
- 问题所在: `Qt5``QWebEngineView` 内存管理存在问题
- 解决方案:升级到 `Qt6` 或者 `PySide6`
- 目前情况:
- 项目已升级到升级到 `PySide6`
- 加载新页面时会出现内存暴涨;如果页面内容比较多,内存占用会更大;如果快速切换页面,内存会涨得更快;
- 但在页面加载完成之后,等待一段时间,内存会下降并稳定下来 *(~=200M)*,可见 `QWebEngineView` 的内存释放存在一定的滞后性

- [ ] 静默模式失效?

- [] `QWebEngineView` 性能问题
- 问题描述:每切换一次页面,内存占用只增不减
- 问题所在: `Qt5``QWebEngineView` 内存管理存在问题
- 解决方案:升级到 `Qt6` 或者 `PySide6`
- 目前情况:
- 项目已升级到升级到 `PySide6`
- 加载新页面时会出现内存暴涨;如果页面内容比较多,内存占用会更大;如果快速切换页面,内存会涨得更快;
- 但在页面加载完成之后,等待一段时间,内存会下降并稳定下来 *(~=200M)*,可见 `QWebEngineView` 的内存释放存在一定的滞后性

- [x] 静默模式失效
- 删除静默模式

- [x] `QWebEngineView` 性能问题
> 就目前的体验来看, `Qt` 内置的 `QWebEngineView` 体验不太好,主要包括:
- 首次加载网页速度出奇得慢 *(看讨论需要禁用代理,我试过了但没啥卵用)*
- 网页内响应出奇得卡 *(硬伤,没得洗)*
- 首次加载网页速度出奇得慢 *(看讨论需要禁用代理,我试过了但没啥卵用)*
- 网页内响应出奇得卡 *(硬伤,没得洗)*

刚好之前了解过 [cef](https://bitbucket.org/chromiumembedded/cef/src/master/) 项目,看看能不能使用 `cef` 替换掉 `QWebEngineView`.
- 试了下结合 `PySide6``cefpython3` 打开微信读书首页,打出来的包比原来的还小,运行速度十分流畅!
- 改日可以研究一下如何实现交互!敬请期待!
- 试了下结合 `PySide6``cefpython3` 打开微信读书首页,打出来的包比原来的还小,运行速度十分流畅!
- 改日可以研究一下如何实现交互!敬请期待!

新版本已发布,将全面拥抱 `cefpython3`
111 changes: 61 additions & 50 deletions app/Application.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,68 +8,79 @@
"""

import sys
from traceback import format_exception

from PySide6.QtCore import QCoreApplication, Qt, QObject
from PySide6.QtCore import QLocale
from PySide6.QtWidgets import QApplication
from cefpython3 import cefpython_py38 as cef

from conf.Config import Config
from conf.Lang import LanguageKeys
from conf.ResMap import ResMap
from conf.Resources import qInitResources
from helper.Cmm import Cmm
from helper.GUI import GUI
from helper.I18n import I18n
from helper.Preferences import Preferences
from helper.Signals import Signals
from helper.Preferences import gPreferences
from ui.view.WindowView import WindowView


def applyCustomExceptionProxy():
_old_hook = sys.excepthook

def customExceptionHook(error_type, error_target, error_stack):
"""自定义全局异常捕获"""
traceback_format = format_exception(error_type, error_target, error_stack)
traceback_msg = "".join(traceback_format)
Signals().logger_error.emit(traceback_msg)
_old_hook(error_type, error_target, error_stack)

sys.excepthook = customExceptionHook


class Application(QObject):
"""应用程序入口"""

def __init__(self):
super().__init__()

# 设置异常代理
applyCustomExceptionProxy()

# 初始化资源
qInitResources()

# 初始化用户配置
Preferences().init()

# 设置应用基础属性

QCoreApplication.setAttribute(Qt.ApplicationAttribute.AA_UseOpenGLES)
QCoreApplication.setAttribute(Qt.ApplicationAttribute.AA_UseHighDpiPixmaps)

# 创建应用
self.app = QApplication(sys.argv)
self.app.setStyleSheet(GUI.Theme.Default)
self.app.setWindowIcon(GUI.icon(ResMap.icon_app))
self.app.setApplicationName(I18n.text(LanguageKeys.app_name))
self.app.setApplicationDisplayName(I18n.text(LanguageKeys.app_name))

# 创建应用主窗口
self.win = WindowView()

def run(self):
self.win.show()
sys.exit(self.app.exec())
"""使用自定义全局异常捕获"""
# 这里直接用 CEF 的就好
sys.excepthook = cef.ExceptHook


def main():
# 调试模式?
Config.DEBUG = '--DEBUG' in sys.argv

# 初始化 cef
cef_module_at = cef.GetModuleDirectory()
cef_settings = {
"debug": Config.DEBUG,
"locale": cef_module_at + Config.LocaleAt,
"log_file": Cmm.appStorageAt(),
"cache_path": Cmm.appStorageAt(),
"context_menu": {"enabled": False},
}
cef_switches = {
"disable-gpu": "",
"disable-gpu-compositing": "",
}
cef.Initialize(settings=cef_settings, switches=cef_switches)

# 设置异常代理
applyCustomExceptionProxy()

# 初始化资源
qInitResources()

# 设置语言
QLocale.setDefault(QLocale(QLocale.Language.Chinese, QLocale.Country.China))

# 初始化用户配置
gPreferences.init()

# 创建应用
app = QApplication(sys.argv)
app.setStyleSheet(Cmm.readFile(ResMap.theme_default))
app.setWindowIcon(GUI.icon(ResMap.icon_app))
app.setApplicationName(Config.AppName)
app.setApplicationDisplayName(I18n.text(LanguageKeys.app_name))

# 创建应用主窗口
win = WindowView()
win.show()
win.activateWindow()
win.raise_()
app.exec()

# 释放 CEF
del win
del app
cef.Shutdown()
sys.exit(0)


if __name__ == "__main__":
Application().run()
main()
1 change: 0 additions & 1 deletion app/__init__.py

This file was deleted.

25 changes: 25 additions & 0 deletions app/conf/Config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-

"""
@File : Config.py
@Time : 2022/10/22 14:38
@Author : DoooReyn<jl88744653@gmail.com>
@Desc : 软件配置
"""


class Config:
# 应用名称
AppName = 'WxReader'

# 应用配置文件名称
AppConfig = 'WxReader.json'

# 调试模式
DEBUG = False

# CEF 语言配置
LocaleAt = "locales/zh-CN.pak"

# Windows 音效资源路径
MediaAt = "C:/Windows/Media/{}.wav"
Loading

0 comments on commit dc824dc

Please sign in to comment.