基于python的图书阅读器 – 苏的小站

成功 用自己的方式度过一生

个人作品展示

苏的小站 ·

面试作品 简历展示、项目简介、技术栈
风格 现代、简约

基于python的图书阅读器

项目地址:suyihang15/book_reader: 基于python的图书阅读器

下载链接:https://github.com/suyihang15/book_reader/releases/download/1.0.0/BookReader.exe

📚 BookReader — 图书管理与阅读器

一款用 Python + PyQt5 编写的桌面端图书管理与阅读器,支持多格式导入、分类管理、阅读进度追踪。本文将详细介绍该程序的设计原理、功能特性、使用方法及技术栈。

🧠 程序原理

整体架构

┌─────────────────────────────────────────────────────┐
│                    MainWindow                        │
│  ┌──────────┬──────────────────────────────────────┐ │
│  │ Category │         QStackedWidget                │ │
│  │ Sidebar  │  ┌─────────────┬──────────────────┐  │ │
│  │          │  │ Library     │    Reader         │  │ │
│  │ 分类筛选  │  │ Widget     │    Widget         │  │ │
│  │          │  │ (书架视图)   │   (阅读器)        │  │ │
│  └──────────┘  └─────────────┴──────────────────┘  │ │
│                     ↑ 信号驱动切换                    │ │
└─────────────────────────────────────────────────────┘

三层数据流

    [用户操作]        [UI 层]          [数据层]         [存储层]
        │               │                │                │
    导入图书 ──→ ImportDialog ──→ parsers.py ──→ SQLite DB
        │               │           (解析元数据)    (library.db)
        │               │                │
    点击分类 ──→ CategorySidebar ──→ database.py ──→ SQLite DB
        │         (发信号)         (get_books_by_category)
        │               │                │
    阅读图书 ──→ ReaderWidget ──→ parsers.py ──→ 文件系统
                      │           (逐页渲染)      (library/)

设计原则

原则体现
信号-槽解耦组件间通过 PyQt5 信号通信,不直接调用彼此方法
数据与视图分离database.py 只管数据 CRUD,UI 层只管展示
解析器策略模式BaseParser 抽象基类,每种格式一个子类,通过工厂方法获取
线程分离导入操作在 QThread 中执行,不阻塞主界面
增量迁移数据库变更通过 ALTER TABLE 兼容已有数据,不丢记录

数据库模型

┌──────────────────────┐       ┌──────────────────────┐
│      categories       │       │        books          │
├──────────────────────┤       ├──────────────────────┤
│ id (PK)              │←──┐   │ id (PK)              │
│ name (UNIQUE)        │   └───│ category_id (FK)     │
│ sort_order           │       │ title                │
└──────────────────────┘       │ author               │
                               │ publisher            │
                               │ description          │
                               │ format               │
                               │ file_path            │
                               │ cover_path           │
                               │ page_count           │
                               │ current_page         │
                               │ tags (JSON)          │
                               │ date_added           │
                               │ last_read            │
                               └──────────────────────┘

✨ 功能特性

📥 图书导入

  • 支持 PDF / EPUB / MOBI / AZW3 / TXT / FB2 格式
  • 拖拽文件/文件夹到窗口即可批量导入
  • 自动解析元数据(书名、作者、出版社、ISBN)
  • 自动提取封面(PDF 首页、EPUB 内置封面、TXT 自动生成)
  • 基于文件 MD5 的重复检测,避免重复导入
  • 导入时可选择分类

📂 分类管理

  • 预设 8 个分类:小说、文学、科技、历史、哲学、艺术、教育、其他
  • 左侧栏按分类筛选图书,显示每类数量
  • 支持添加、重命名、删除自定义分类
  • 图书卡片显示分类标签
  • 编辑详情时可修改分类

📚 书架视图

  • 网格视图:卡片式封面展示,鼠标悬停放大效果
  • 列表视图:紧凑列表,适合大量图书浏览
  • 搜索:按书名/作者实时过滤
  • 排序:最近添加、书名 A-Z、作者 A-Z、最近阅读

📖 阅读器

  • PDF 高清渲染(150 DPI),逐页加载
  • EPUB/TXT HTML 文本渲染,自动分页
  • 三种主题:☀️ 日间 / 🌙 夜间 / 📜 护眼
  • 字体大小自由调节(A+/A- 按钮)
  • 键盘快捷键翻页(← → / A D)
  • 阅读进度自动保存,下次打开继续阅读

✏️ 元数据编辑

  • 编辑书名、作者、出版社、ISBN、描述
  • 自定义标签(逗号分隔)
  • 更换/重置封面图片
  • 修改所属分类

🚀 快速开始

环境要求

  • Python 3.8+
  • Windows / Linux / macOS

安装依赖

pip install -r requirements.txt

运行

python main.py

首次运行会自动创建 library.db 数据库和 library/ 目录结构。

🎮 操作指南

导入图书

方式操作
按钮导入点击工具栏「📥 导入图书」→ 选择文件
文件夹导入菜单栏 文件 → 导入文件夹(Ctrl+Shift+I)
拖拽导入将文件/文件夹直接拖入窗口

导入时可选择「导入到分类」,将图书直接归入指定分类。

浏览与管理

操作方式
分类筛选点击左侧栏分类名称
搜索图书顶部搜索框输入书名或作者
排序切换搜索框旁下拉菜单切换排序方式
视图切换菜单栏 视图 → 网格视图 / 列表视图
编辑详情右键图书卡片 → ✏️ 编辑详情
删除图书右键图书卡片 → 🗑️ 删除
管理分类左侧栏底部「⚙ 管理分类」按钮

阅读图书

操作方式
打开阅读点击图书封面 或 右键 → 📖 阅读
上一页← 键 / A 键 / 点击「◀ 上一页」
下一页→ 键 / D 键 / 点击「下一页 ▶」
跳转页码导航栏输入页码或拖动滑块
首/末页Home / End 键
字体放大点击 A+ 按钮
字体缩小点击 A- 按钮
切换主题右上角下拉菜单(日间/夜间/护眼)
返回书架Esc 键 / 点击「← 返回书架」

📂 项目结构

book_reader/
├── main.py                    # 程序入口
├── requirements.txt           # Python 依赖清单
├── database.py                # SQLite 数据库层(CRUD + 迁移)
├── parsers.py                 # 多格式解析器(策略模式)
├── utils.py                   # 工具函数(封面生成、文件哈希)
├── ui/
│   ├── __init__.py
│   ├── main_window.py         # 主窗口(菜单、工具栏、状态栏)
│   ├── library_widget.py      # 书架视图(网格/列表 + 图书卡片)
│   ├── reader_widget.py       # 阅读器(PDF/EPUB/TXT 渲染)
│   ├── import_dialog.py       # 导入对话框(多线程导入)
│   ├── detail_dialog.py       # 详情编辑对话框
│   ├── category_sidebar.py    # 分类侧边栏(分类筛选)
│   └── category_dialog.py     # 分类管理对话框
├── library/                   # 图书文件存储目录
│   └── .covers/               # 封面图片缓存
└── library.db                 # SQLite 数据库文件

各模块职责

模块职责依赖
database.py数据库初始化、图书/分类 CRUD、增量迁移SQLite3
parsers.py解析各格式图书元数据与内容PyMuPDF, ebooklib, BS4
utils.py封面生成、哈希去重、格式判断Pillow
main_window.py窗口框架、菜单/工具栏、信号路由PyQt5
library_widget.py书架渲染、搜索/排序/分类筛选PyQt5
reader_widget.py阅读器渲染、主题/字体切换PyQt5
import_dialog.py导入 UI + 后台线程PyQt5, parsers
detail_dialog.py图书元数据编辑表单PyQt5
category_sidebar.py分类列表展示 + 筛选信号PyQt5
category_dialog.py分类增删改管理PyQt5

🛠️ 技术栈

组件技术用途
GUI 框架PyQt5窗口、布局、信号槽
PDF 解析PyMuPDF (fitz)PDF 元数据提取 + 页面渲染
EPUB 解析ebooklib + BeautifulSoup4EPUB 元数据 + HTML 内容提取
图像处理Pillow封面生成、缩放、格式转换
数据库SQLite3图书记录、分类、阅读进度
线程QThread导入不阻塞 UI

⚠️ 注意事项

  • 导入时会复制文件到 library/ 目录,原始文件不受影响
  • 删除图书会同时删除 library/ 中的副本和封面缓存
  • MOBI/AZW 格式仅基础元数据支持,建议转为 EPUB 后导入获得完整体验
  • 数据库文件 library.db 和 library/ 目录是核心数据,备份时请保留
  • 分类表中的默认分类可按需修改或删除

效果展示

总结:这是本人弄的一个图书阅读器,支持各种类型的图书文件,但是打包的是单文件,所以启动稍微有点慢,可以自行打包一下。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注