用Python+Flask打造可视化武侠人物关系图生成器:从零到一的实战全记录
用Python+Flask打造可视化武侠人物关系图生成器:从零到一的实战全记录
一、缘起:一个程序小白的奇妙探索之旅
作为一个接触Python仅13天的编程萌新,我曾以为开发一个完整的应用是遥不可及的事情。但在DeepSeek的帮助下,我竟用短短半天时间完成了一个本地化武侠人物关系图生成器的开发!这个工具不仅能批量管理门派和人物,还能自动生成关系图并导出Excel表格,整个过程充满了挑战与惊喜。
本文将完整记录我的开发过程,手把手带你用Python+Flask实现这个有趣的项目,最终效果如下:
二、制作思路:如何化繁为简
-
核心需求
- 批量添加门派和人物
- 可视化展示人物关系
- 支持增删改查操作
- 导出结构化数据
-
技术选型
- Flask:轻量级Web框架,快速搭建后端服务
- Graphviz:专业关系图绘制工具
- openpyxl:Excel文件生成库
- HTML+JavaScript:前端交互实现
-
架构设计
三、准备工作:配置开发环境
-
基础工具
- Python 3.8+
- VS Code/PyCharm
- 浏览器(推荐Chrome)
-
安装依赖库
pip install flask graphviz openpyxl
-
Graphviz安装
- Windows:官网下载安装包
- Mac:
brew install graphviz
- Linux:
sudo apt-get install graphviz
四、实战开发:七步打造完整系统
步骤1:创建项目结构
📁 Novel-Relationship-Generator
├── 📁 static
│ └── 📁 output # 存放生成图片
├── 📁 templates
│ └── index.html # 前端页面
└── app.py # 主程序
步骤2:编写后端核心(app.py)
from flask import Flask, render_template, request, jsonify, send_file
from graphviz import Digraph
import re
from openpyxl import Workbookapp = Flask(__name__)# 数据存储
characters = []
sects = ["武当派", "少林派", "峨眉派", "嵩山派"] # 初始门派
relations = []
sect_descriptions = {"武当派": "以柔克刚的内家拳法","少林派": "天下武功出少林","峨眉派": "女子为主的武林门派","嵩山派": "五岳剑派之首"
}
char_descriptions = {}# 此处省略接口代码(与前文相同)...if __name__ == "__main__":app.run(debug=True)
步骤3:前端页面开发(templates/index.html)
<!-- 门派添加模块 -->
<form id="add-sects-form"><label>批量添加门派(支持逗号/分号/空格分隔):</label><textarea name="sects" rows="3" placeholder="示例:华山派,日月神教"></textarea><button type="submit">添加门派</button>
</form><!-- 人物关系展示区 -->
<div class="right-panel"><h2>武林门派谱</h2><div id="characters-list"><!-- 动态加载门派及人物 --></div>
</div>
步骤4:添加示例数据
# 示例人物数据
characters.extend([{"name": "张三丰", "sect": "武当派"},{"name": "宋远桥", "sect": "武当派"},{"name": "空闻大师", "sect": "少林派"},{"name": "灭绝师太", "sect": "峨眉派"},# 可继续添加其他人物...
])# 示例关系数据
relations.extend([{"from": "张三丰", "to": "宋远桥", "label": "师徒"},{"from": "空闻大师", "to": "张三丰", "label": "故交"},# 添加更多关系...
])
步骤5:实现关系图生成
@app.route("/generate_graph", methods=["POST"])
def generate_graph():dot = Digraph(comment="武林关系图")dot.attr(rankdir="LR", nodesep="0.3")# 添加门派分组for sect in sects:with dot.subgraph(name=f"cluster_{sect}") as sub:sub.attr(label=sect, style="filled", color="lightgrey")for char in characters:if char["sect"] == sect:sub.node(char["name"], shape="box")# 绘制关系线for rel in relations:dot.edge(rel["from"], rel["to"], label=rel["label"])dot.render("static/output/relationship.gv", format="png")return jsonify({"status": "success"})
步骤6:导出Excel功能
@app.route("/export_excel")
def export_excel():wb = Workbook()ws = wb.activews.append(["序号", "门派", "门派简介", "人物", "人物简介"])row_num = 1for sect in sects:desc = sect_descriptions.get(sect, "")members = [c for c in characters if c["sect"] == sect]for i, char in enumerate(members):char_desc = char_descriptions.get(char["name"], "")if i == 0:ws.append([row_num, sect, desc, char["name"], char_desc])else:ws.append([row_num, sect, "", char["name"], char_desc])row_num += 1wb.save("武林人物表.xlsx")return send_file("武林人物表.xlsx")
步骤7:运行与测试
python app.py
访问 http://localhost:5000
即可体验完整功能
五、项目亮点总结
-
便捷操作
- 批量导入/导出功能节省时间
- 实时可视化反馈
-
技术融合
- 前后端分离架构
- 多格式输出支持(PNG/PDF/Excel)
-
扩展性强
- 支持自定义样式
- 易于添加新功能模块
六、心得体会:新手的编程启示
- 小步快跑:从简单功能入手,逐步迭代完善
- 善用工具:Graphviz等成熟库能大幅提升效率
- 调试技巧:
- 使用浏览器开发者工具查看网络请求
- 添加
print
语句追踪数据流向
- 文档价值:
- Flask官方文档
- Graphviz语法指南
给读者的建议:不要被复杂的功能吓倒,把大问题拆解成小模块逐个击破。就像搭建乐高积木一样,把每个Python功能模块看作一块积木,最终就能拼出完整的作品!
立即动手尝试吧! 基于这个项目还可以拓展思路,比如把做一个日常工作管理的页面等,所以马上行动起来把,你的世界正等待被创造~ 🎉
目前刚开始学编程,并试着在CSDN发表文章,如果需要完整代码,可以在评论区留言并私信我。
相关文章:

用Python+Flask打造可视化武侠人物关系图生成器:从零到一的实战全记录
用PythonFlask打造可视化武侠人物关系图生成器:从零到一的实战全记录 一、缘起:一个程序小白的奇妙探索之旅 作为一个接触Python仅13天的编程萌新,我曾以为开发一个完整的应用是遥不可及的事情。但在DeepSeek的帮助下,我竟用短短…...
学习笔记-DeepSeek在开源第四天发布DualPipe和EPLB两项技术
在AI模型训练的进程中,优化并行策略对于提升训练效率和资源利用率至关重要。DeepSeek在开源周第四天发布的DualPipe和EPLB两项技术,为V3/R1训练场景下的并行优化提供了创新解决方案。 DualPipe:双向管道并行算法 技术原理: Dua…...

C++入门基础知识1
今天,我们正式来学习C,由于C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C学习有一定的帮助。 现在我们这篇主要是: 1. 补充C语言语法…...

神经网络AI原理回顾
长期记忆存储在大模型的参数权重中,不经过推理和编码无法读取,且必须依赖输入的提示,因为大模型不会无缘无故的自言自语,毕竟输入层是它唯一 与外界交互的窗口。 目前个性化大模型的局限就是训练成本过高,除非使用RAG&…...

PPT 小黑第38套
对应大猫40 幻灯片母板-最后一页-重命名为奇数页 奇偶页-点中标题-形状格式-形状填充-青色 最后一页页码左对齐 更换幻灯片背景:设计-设置背景格式-图片填充 【开始】-段落居中,对齐文本-中部对齐,排列-对齐-底端,-再水平居中…...

主时钟与虚拟时钟约束
1、主时钟约束 1.1、主时钟约束语法: create_clock -name< clock_name > -period <period> -waveform{ <rise_time> <fall_time> } [get_ports< port_name >] 说明: name 之后的<clock_name> 是clk 的name&a…...

K8S学习之基础六:k8s中pod亲和性
Pod节点亲和性和反亲和性 podaffinity:pod节点亲和性指的是pod会被调度到更趋近与哪个pod或哪类pod。 podunaffinity:pod节点反亲和性指的是pod会被调度到远离哪个pod或哪类pod 1. Pod节点亲和性 requiredDuringSchedulingIgnoredDuringExecution&am…...

如何通过rust实现自己的web登录图片验证码
在进行web系统开发时,为保障系统登录安全,登录页面中的验证码必不可少。在java中,我们可以利用相应的2D图像库快速生成图形验证码,而对于rust,我们没有合适的标准库进行图像验证码的生成。今天,我们通过使用…...

盛京开源社区加入 GitCode,书写东北开源生态新篇章
在数字化转型与开源技术蓬勃发展的浪潮下,开源社区已成为推动技术创新的核心力量。盛京开源社区(SJOSC)作为沈阳地区的开源交流平台,始终致力于连接开发者、企业及高校,构建区域技术生态圈。 现在,盛京开源…...
QKV 注意力机制在Transformer架构中的作用,和卷积在卷积神经网络中的地位,有哪些相似之处?
QKV 注意力机制在Transformer架构中的作用,和卷积在卷积神经网络中的地位,有哪些相似之处? QKV(Query-Key-Value)注意力机制在Transformer架构和卷积在卷积神经网络(CNN)中都起着核心作用&…...
高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制
高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制 📚 目录 API速率限制的基本概念Redis实现分布式速率限制防止DDoS攻击的常见策略基于IP或用户身份的访问频率控制 1. API速率限制的基本概念 API速率限制(Rate Limiting&…...

Centos7源码编译安装Sqlite最新版本
下载源码 https://www.sqlite.org/download.html 复制下载链接,然后用 wget 下载 wget https://www.sqlite.org/2025/sqlite-autoconf-3490100.tar.gz 解压缩编译安装 tar -zxf sqlite-autoconf-3490100.tar.gz cd sqlite-autoconf-3490100 ./configure --prefi…...
mybatis热点面试题第五弹
1. MyBatis与Hibernate的区别 答案: MyBatis: 不完全是一个ORM框架,需要手动编写SQL语句,灵活性高,适合对数据库操作有高性能要求的场景。缺点是无法做到数据库无关性,如果需要支持多种数据库,…...

KTransformers部署 使671B DeepSeek R1成「办公桌标配」
671B DeepSeek R1成「办公桌标配」 1. 什么是KTransformersDeepSeek 版本技术破局密钥:强稀疏化MoE模型需要全新的私有化架构设计趋境AI大模型推理软硬一体工作站——让大模型推理门槛降低10倍 2. 准备环境3 环境准备与资源下载4 安装过程1. linux环境搭建2. window…...

sql-labs less5-8
Less-5 双注入 基于单引号的字符型注入,涉及二次查询注入 Less-6 双注入 基于双引号的字符型注入,涉及二次查询注入 Less-7 字符型注入 基于单引号变形注入之导入文件 Less-8 布尔盲注 不返回任何错误信息,通过布尔逻辑判断 以下…...
一个大型应用的云原生一般有多少个服务?
DeepSeek R1 思考 1 秒 思考过程 在云原生架构中,大型应用的服务规模呈现动态分布特征。根据行业实践和架构模式分析,服务划分的核心考量维度包括: 一、业务领域驱动划分 核心业务服务群(通常15-30个) 用户中心&…...

Linux下安装VS Code
Centos 7 https://blog.csdn.net/weixin_63790642/article/details/132927888 安装存储库 sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc密钥 sudo sh -c echo -e "[code]\nnameVisual Studio Code\nbaseurlhttps://packages.microsoft.com/yum…...
【零基础到精通Java合集】第一集:Java开发环境搭建
以下是针对**“Java开发环境搭建”**的15分钟课程内容设计,包含知识点拆分、实操演示与互动练习: 课程标题:Java开发环境搭建(15分钟) 目标:完成JDK安装、IDE配置并运行第一个Java程序 一、课程内容与时间分配 0-2分钟 课程目标与前置准备 明确学习目标:JDK安装、环境…...
Rocky Linux 系统安装 typecho 个人博客系统(Docker 方式)
typecho 博客系统安装 官网: https://typecho.org/ 1. 安装 Docker curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo && yum install docker-ce -y && docker -v && systemctl enable --now docker…...
C++-第二十一章:特殊类设计
目录 第一节:特殊类 1-1.不能被拷贝的类 1-2.只能在堆上构造的类 1-3.只能在栈上构造的类 1-4.只能构造一个对象的类 第二节:工厂模式 下期预告: 第一节:特殊类 1-1.不能被拷贝的类 不能被拷贝的类有线程类、std::unique_ptr、…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...