SHELF · READER · SOURCES

Py 书斋

拟物复古书架阅读器 · PyShelf

把你的书籍目录变成一间深色书房——木纹书架、真实封面、书签丝带与烛光夜读。 纯 Python 桌面工具,本地运行,不改原书一字一节。

◆Python 3.12+ ◆tkinter · PyMuPDF · Pillow ◆Windows ◆单文件夹 · 零配置 ◆数据全本地
开始使用 查看源码
Py 书斋拟物书架主界面:木纹层板上的书籍封面与阅读进度角标
书架 · 最近阅读 / 收藏 / 全部书籍,封面左上角为「在读 N%」进度角标
01

界面一览

阅读器界面:左侧目录侧栏,右侧渲染的 PDF 页面
阅读器 · PDF 高清渲染 + 目录侧栏 + 纸面配色
书源检索面板:GitHub 开源书库、arXiv、Gutenberg 等来源
书源检索 · 多来源搜索,一键下载入库
02

功能特性

📚

拟物书架

程序化绘制的木纹背景与层板——年轮曲线、颗粒、暗角,不依赖任何图片素材。 书籍以真实封面(PDF 首页渲染)立于架上,最近阅读 / 收藏 / 全部三区分栏。

📖

PDF 阅读器

PyMuPDF 2 倍超采样渲染,50%–300% 缩放、适配页宽、跳页直达; 米白纸底配色,内置「烛光」夜间模式,侧栏展示文档目录(TOC)。

🔖

书签与高亮

当前页加书签并附备注,红丝带标记书签页;阅读页上拖框即高亮, 以 PDF 坐标存储叠加显示——原文件不做任何修改。

⭐

收藏与历史

右键收藏入「收藏 ★」分区;自动记录阅读进度,封面「在读 N%」角标一目了然, 重开自动续读到上次停留的页面。

⬇

多书源检索

GitHub 开源书库、arXiv 论文、Gutenberg 公版书、URL 直链, 还支持自定义 JSON 规则书源对接自有站点;下载后自动入库重扫。

🔍

标题清洗与搜索

自动清理 Z-Library / ISBN / 内容哈希等下载后缀噪声,还书籍一个干净书名; 顶栏输入即时过滤书架。

🖥

高 DPI 感知

声明 Per-Monitor DPI Awareness,高分屏下封面与文字锐利不模糊; 独立 AppUserModelID 使任务栏正确显示应用图标。

🧰

健壮性设计

后台线程扫描 + 主线程事件泵,单条消息异常不拖垮轮询; 回调异常落盘 data/crash.log,告别「按钮点了没反应」。

操作快捷键 / 方式
打开书籍双击封面
翻页← → PageUp PageDown / 滚轮;Home End 首末页
缩放工具栏 + / -(50%–300%);「适配页宽」一键适配
添加书签工具栏「加书签」→ 填写备注(可选)
文字高亮阅读页按住左键拖框 → 回车确认(可附备注)
目录 / 书签 / 高亮左侧栏三个标签页,双击条目跳转
收藏管理封面右键菜单:收藏 / 打开所在文件夹 / 重命名显示标题
返回书架阅读工具栏「◂ 书架」;书源界面按 Esc
03

书源检索

书源说明
GitHub 开源书库关键词搜索开源书籍仓库 → 列出其中 PDF / EPUB / TXT → 下载入库。jsDelivr 主通道 + raw 备用,可选配 Token 提升限额
arXiv 论文检索预印本直接下载 PDF;触发官方限流时自动退避重试并友好提示
Gutenberg 公版书输入书号(如 1342)下载公版 TXT / EPUB
URL 直链导入粘贴任意 http(s) 书籍直链直接入库
自定义书源 ◆JSON 规则引擎:search_url 模板(含 {q} 占位符)+ results_path 结果路径 + 字段映射,可对接任何自有站点 API
合规说明:内置书源均为公开合法资源(开源仓库、预印本、公版书、自有直链)。 不提供也不预设任何盗版书库接入;自定义书源的内容合法性由配置者自行负责。
04

快速开始

1 · 安装 Python3.10+ 官方安装包(自带 tkinter),勾选 Add to PATH
2 · 安装依赖pip install pymupdf pillow
3 · 启动双击 launcher.bat,首次启动选择你的书籍目录即可
PowerShell / CMD
# 克隆并进入项目
git clone https://github.com/yohoten/PyShelf.git
cd PyShelf

# 安装运行依赖(PyMuPDF 负责 PDF 渲染,Pillow 负责封面/木纹处理)
pip install pymupdf pillow

# 启动:双击 launcher.bat,或手动运行
python app.py
launcher.bat 的两种模式
launcher.bat          :: 正常启动(pythonw 无控制台窗口)
launcher.bat debug    :: 控制台运行,报错直接可见,可追加参数
launcher.bat debug --smoke

渲染管线

PyMuPDF 页面位图 → Pillow 书脊高光 / 圆角 / 投影合成 → tkinter Canvas 显示

程序化材质

木纹 = 渐变 + 年轮曲线 + 高斯颗粒 + 暗角,全部运行时生成,零图片素材

并发模型

慢 IO(扫描 / 探测 / 封面 / 下载)在后台线程,书库增删一律回主线程,杜绝竞态

持久化

data/library.json 保存书籍、收藏、书签、高亮与进度;整目录拷走即可迁移

项目结构
PyShelf/
├─ launcher.bat        # 启动脚本(GBK+CRLF,自动探测解释器,支持 debug)
├─ app.py              # 入口:视图切换、后台扫描、事件泵、持久化
├─ app.ico             # 多分辨率应用图标(16–128px)
├─ core/
│  ├─ library.py       # Book 数据模型 + library.json 读写
│  ├─ scanner.py       # 目录扫描、标题清洗、封面生成
│  ├─ pdf_engine.py    # PyMuPDF 渲染 / 目录 / 高亮叠加 / 烛光滤镜
│  ├─ sources.py       # 书源引擎(GitHub / arXiv / Gutenberg / 自定义)
│  └─ downloader.py    # 后台下载器(进度回报、备用通道)
└─ ui/
   ├─ theme.py         # 配色 / DPI / 字体 / 木纹纹理 / 封面渲染
   ├─ shelf_view.py    # Canvas 拟物书架
   ├─ reader_view.py   # 阅读器(超采样渲染 / 翻页 / 书签 / 高亮)
   ├─ sidebar.py       # 目录 / 书签 / 高亮侧栏
   └─ source_view.py   # 书源检索面板