Python+MySQL学生管理系统:可视化界面落地与避坑指南

简介:这是一套面向Python与数据库初学者的学生管理系统实战项目,采用Python编写客户端逻辑、MySQL负责数据存储,适合正在学习桌面应用开发或需要完成课程设计的学生参考。压缩包共2个文件,包含1个py主程序与1个sql数据库脚本,整体仅7KB,轻量易读,导入数据库后即可运行体验。系统围绕学生信息、课程信息、成绩信息与系统管理四大模块展开,支持对学生基本信息、选课情况、考试成绩、平时成绩及总成绩的录入、修改、查询与删除,同时可维护课程名称、授课教师、学分等数据,帮助读者理解客户端与数据库交互的完整流程。目前已有6765人学习下载,代码结构简洁,适合作为入门练手或二次开发的基础模板,快速掌握Python操作MySQL的增删改查思路。

1. 用 Python + MySQL 搭一套学生管理系统,可视化界面到底该怎么落地

很多同学第一次做课程设计或练手项目,都会选「Python + MySQL 学生管理系统 + 可视化界面」这个组合。原因很实在:需求清晰、数据关系简单、能同时练到数据库和界面两块,做完还能直接演示。但真正动手时,翻车点往往不在业务逻辑,而在环境、编码、界面卡顿这些细节上。我见过太多人卡在「连不上数据库」或者「中文乱码」上耗掉一整天。这篇笔记就按我自己的实操路径,把从建库、写后端到接可视化界面的完整链路拆开讲清楚,重点放在参数怎么设、坑在哪、怎么排查。适合正在做课程设计、想快速跑通一个可演示系统的开发者,也适合想把零散知识串成完整项目的新手。

2. 先定技术栈再动手:Tkinter、PyQt 还是 Web 界面

选型这一步看着简单,其实决定了后面一半的工作量。标题里说的「可视化界面」范围很宽,桌面窗口是可视化,浏览器页面也是可视化。我一般会先问自己三个问题:要不要打包成 exe 给别人用?数据量大不大?有没有多用户同时访问的需求?答案不同,选型完全不同。

2.1 三种可视化路线的真实取舍

桌面端最省事的是 Tkinter,Python 自带,不用装额外依赖,写个表格加几个按钮就能跑。缺点是控件丑、样式定制麻烦,做复杂布局会写得很啰嗦。PyQt(或 PySide)控件丰富、表格和表单都现成,适合做正经的桌面应用,代价是学习曲线陡一点,打包体积也大。Web 路线用 Flask 或 FastAPI 加前端页面,浏览器直接访问,天然支持多用户,但要多写一层接口和页面,部署也复杂一些。

我的经验是:课程设计、单机演示、数据量在几千条以内,直接上 Tkinter,最快出成果;如果界面要求高、要做成能长期用的工具,选 PyQt;如果明确要求「多人访问」或者「手机也能看」,那就走 Web。下面这张表是我自己选型时对照用的。

路线依赖上手难度适合场景打包体积
Tkinter标准库低课程设计、单机演示小
PyQt/PySide需安装中桌面工具、复杂界面大
Flask/FastAPI + 前端需安装中高多用户、跨设备中

2.2 数据库驱动怎么选:mysql-connector 还是 PyMySQL

连 MySQL 的 Python 驱动常见有两个:官方出的 mysql-connector-python,和纯 Python 实现的 PyMySQL。前者安装即用,兼容性好;后者纯 Python,不需要编译环境,在某些受限机器上更省心。我一般用 PyMySQL,因为它装起来几乎不会报错,而且 API 和 MySQLdb 兼容,网上例子多。

安装命令很简单:

pip install pymysql

如果你用 mysql-connector,把 import 换成import mysql.connector即可,连接参数名基本一致。这里有个容易忽略的点:驱动只负责连接和传 SQL,真正的数据约束、索引、字符集还是要在 MySQL 里设好,别指望驱动帮你兜底。

2.3 建库建表:字符集和主键这两个参数必须一次设对

建库时最容易翻车的就是字符集。默认字符集如果是 latin1,存中文就会变问号。我一般建库时直接指定 utf8mb4,它能存 emoji 和生僻字,比 utf8 更全。

-- 建库,字符集一次设对,避免后期改表 CREATE DATABASE student_mgr DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE student_mgr; -- 学生表:学号做主键,避免重名冲突 CREATE TABLE student ( sno VARCHAR(20) PRIMARY KEY, -- 学号,业务主键 name VARCHAR(50) NOT NULL, -- 姓名 gender CHAR(2) DEFAULT '男', -- 性别 age INT DEFAULT 18, -- 年龄 major VARCHAR(50), -- 专业 phone VARCHAR(20) -- 联系电话 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

逻辑说明:用学号而不是自增 id 做主键,是因为学号本身唯一且业务上要频繁查询,省一次映射。ENGINE=InnoDB支持事务和外键,后面如果要加成绩表关联学生,会方便很多。参数上,VARCHAR(20)对学号足够,别用CHAR固定长度,否则短学号会补空格,查询时容易对不上。建完表可以用SHOW CREATE TABLE student;确认字符集是不是 utf8mb4,这一步别省。

3. 把后端写扎实:连接封装、增删改查与防注入

界面再好看,后端不稳一样白搭。这一章讲怎么把数据库连接封装好、怎么写增删改查、怎么防止 SQL 注入。很多人写查询直接用字符串拼接,测试时没事,一旦输入带引号就崩,这就是典型的注入隐患。

3.1 连接封装:一个函数管住所有连接参数

我习惯把连接参数集中在一个函数里,改配置只改一处。同时用上下文管理器保证连接用完就关,避免连接泄漏。

import pymysql # 数据库配置集中管理,改一处即可 DB_CONFIG = { "host": "127.0.0.1", "port": 3306, "user": "root", "password": "your_password", "database": "student_mgr", "charset": "utf8mb4", # 必须和建库字符集一致 "cursorclass": pymysql.cursors.DictCursor # 返回字典,取值更方便 } def get_conn(): """获取数据库连接""" return pymysql.connect(**DB_CONFIG)

逻辑说明:DictCursor让查询结果以字典返回,界面取值时用row["name"]比row[1]可读得多。charset一定要和建库时一致,否则中文照样乱码。密码不要硬编码在代码里提交到公开仓库,本地练习无所谓,但养成用环境变量读取的习惯更好。

3.2 增删改查:参数化查询是底线

下面这段是学生信息的核心操作,重点看 SQL 里的%s占位符——这是参数化查询,不是字符串拼接。

def add_student(sno, name, gender, age, major, phone): """新增学生,参数化查询防注入""" sql = "INSERT INTO student(sno,name,gender,age,major,phone) VALUES(%s,%s,%s,%s,%s,%s)" with get_conn() as conn: with conn.cursor() as cur: cur.execute(sql, (sno, name, gender, age, major, phone)) conn.commit() # 写操作必须提交 def query_students(keyword=""): """按姓名或学号模糊查询""" sql = "SELECT * FROM student WHERE name LIKE %s OR sno LIKE %s" like = f"%{keyword}%" with get_conn() as conn: with conn.cursor() as cur: cur.execute(sql, (like, like)) return cur.fetchall() def delete_student(sno): """按学号删除""" sql = "DELETE FROM student WHERE sno=%s" with get_conn() as conn: with conn.cursor() as cur: cur.execute(sql, (sno,)) conn.commit()

逻辑说明:cur.execute(sql, params)会把参数交给驱动做转义,即使输入里带单引号也不会破坏 SQL 结构。写操作(INSERT/UPDATE/DELETE)必须commit(),否则数据不会真正落库,这是新手最常见的「明明执行了却查不到」的原因。查询用fetchall()拿全部结果,数据量大时改用fetchmany(size)分批取,避免一次性占满内存。

3.3 事务与异常:别让一次失败拖垮整个连接

真实场景里,插入学生和插入他的初始成绩往往要一起成功或一起失败,这就用到事务。我一般把一组操作包在 try 里,出错就回滚。

def add_student_with_score(sno, name, score): """学生和成绩一起写入,任一失败则回滚""" conn = get_conn() try: with conn.cursor() as cur: cur.execute("INSERT INTO student(sno,name) VALUES(%s,%s)", (sno, name)) cur.execute("INSERT INTO score(sno,score) VALUES(%s,%s)", (sno, score)) conn.commit() except Exception as e: conn.rollback() # 出错回滚,保证数据一致 print("写入失败:", e) finally: conn.close() # 无论成败都关闭连接

逻辑说明:rollback()是后悔药,能把这次事务里已执行的语句全部撤销。finally里关连接,防止异常路径下连接泄漏。参数上,score表需要提前建好并设sno外键关联学生表,否则第二条插入会因约束失败而触发回滚,这正好验证了事务是否生效。

4. 接上可视化界面:Tkinter 表格与表单的联动写法

后端通了,接下来把它接到界面上。我用 Tkinter 演示,因为它零依赖、代码短,适合快速验证。核心就两块:一个表格显示数据,一组输入框加按钮做增删改查。难点在于「选中表格某行后,输入框要自动填充」,这个联动逻辑写不好就会出现改了 A 行却更新到 B 行的情况。

4.1 用 Treeview 搭数据表格

Tkinter 自带的ttk.Treeview就是现成的表格控件,支持列头和行选中。

import tkinter as tk from tkinter import ttk, messagebox root = tk.Tk() root.title("学生管理系统") root.geometry("760x480") # 定义表格列,columns 里的 key 要和取值时一致 columns = ("sno", "name", "gender", "age", "major", "phone") tree = ttk.Treeview(root, columns=columns, show="headings") headers = ["学号", "姓名", "性别", "年龄", "专业", "电话"] for col, text in zip(columns, headers): tree.heading(col, text=text) tree.column(col, width=110, anchor="center") tree.pack(fill="both", expand=True, padx=10, pady=10) def refresh(): """清空表格并重新加载数据""" for item in tree.get_children(): tree.delete(item) for row in query_students(): tree.insert("", "end", values=( row["sno"], row["name"], row["gender"], row["age"], row["major"], row["phone"]))

逻辑说明:show="headings"隐藏默认的首列,只显示我们定义的列头。refresh()先删掉所有旧行再重新插入,这是最简单的刷新方式,数据量大时会有闪烁,可以改用增量更新。tree.insert的values顺序必须和columns一致,否则列会错位,这是很隐蔽的坑。

4.2 表单联动:选中行回填与更新

选中表格某行后,把该行数据填回输入框,用户改完点更新,再写回数据库。关键是拿到选中行的学号作为更新条件。

def on_select(event): """点击表格行,回填到输入框""" sel = tree.selection() if not sel: return values = tree.item(sel[0], "values") entry_sno.delete(0, tk.END); entry_sno.insert(0, values[0]) entry_name.delete(0, tk.END); entry_name.insert(0, values[1]) # 其余字段同理,此处省略重复代码 def update_student(): """按学号更新学生信息""" sno = entry_sno.get().strip() if not sno: messagebox.showwarning("提示", "请先选中一行") return sql = "UPDATE student SET name=%s, gender=%s, age=%s, major=%s, phone=%s WHERE sno=%s" with get_conn() as conn: with conn.cursor() as cur: cur.execute(sql, (entry_name.get(), gender_var.get(), entry_age.get(), entry_major.get(), entry_phone.get(), sno)) conn.commit() refresh() # 更新后刷新表格 tree.bind("<<TreeviewSelect>>", on_select)

逻辑说明:tree.bind把选中事件绑到on_select,实现点击回填。更新时用学号做WHERE条件,而不是用行号,因为行号会随排序和刷新变化,用行号更新迟早出错。entry.get().strip()去掉首尾空格,避免用户误输空格导致查询不到。更新完必须refresh(),否则界面显示的还是旧数据,用户会以为没生效。

4.3 界面卡顿与线程:查询慢时别阻塞主循环

Tkinter 是单线程的,如果查询数据量大或者数据库响应慢,界面会直接卡死,点哪都没反应。常见做法是把耗时操作放到子线程里,查完再用root.after回主线程更新界面。

import threading def load_async(): """子线程查询,主线程更新界面""" def work(): data = query_students() # 耗时查询在子线程 root.after(0, lambda: render(data)) # 回主线程渲染 threading.Thread(target=work, daemon=True).start() def render(data): for item in tree.get_children(): tree.delete(item) for row in data: tree.insert("", "end", values=(row["sno"], row["name"]))

逻辑说明:daemon=True让子线程随主程序退出,避免残留。root.after(0, ...)把渲染任务排进主线程事件队列,这是 Tkinter 跨线程更新界面的安全方式,直接在子线程里操作控件会报错或崩溃。参数上,如果查询本身很快(几千条以内),其实不用上线程,过度设计反而增加复杂度,先测再决定。

5. 避坑与排查:中文乱码、连不上库、界面无响应

这一章是我踩过的坑里最高频的几个,每条按「现象 → 原因 → 解决」写,照着排查基本能定位。

现象一:存进去的中文变成问号或乱码。原因通常是建库或建表时字符集不是 utf8mb4,或者连接参数里没设 charset。解决:先SHOW CREATE DATABASE student_mgr;看字符集,不对就ALTER DATABASE student_mgr CHARACTER SET utf8mb4;,表也要ALTER TABLE student CONVERT TO CHARACTER SET utf8mb4;,最后确认连接配置里charset="utf8mb4"。三处都对了才不会乱码。

现象二:报错Access denied for user或连不上 3306。原因是账号密码错、用户没有远程权限,或者 MySQL 服务没启动。解决:先用命令行mysql -u root -p确认能登录,能登录说明服务正常;再看代码里的 host 是不是写成了localhost而实际要走127.0.0.1,两者在部分环境下解析行为不同。权限问题用GRANT授权,别直接用 root 跑生产。

现象三:执行了 INSERT 但查不到数据。原因是忘了commit()。PyMySQL 默认不开自动提交,写操作必须显式提交。解决:在写操作后加conn.commit(),或者连接时设autocommit=True。我一般显式提交,因为事务控制更清晰。

现象四:界面点按钮没反应,窗口卡死。原因是耗时查询阻塞了主线程。解决:按 4.3 的方式把查询放子线程,用root.after回主线程更新。如果只是偶尔卡,先确认是不是数据库连接没关导致连接池耗尽,检查每个连接是否都close()了。

现象五:更新数据时改错了行。原因是用了表格行号而不是业务主键做更新条件。解决:始终用学号这类唯一字段做WHERE条件,选中行时把学号存下来,更新时用它定位。

提示:排查数据库问题时,先把 SQL 单独拿到命令行里跑一遍,能排除掉一大半「到底是 SQL 错还是代码错」的纠结。

6. 进阶技巧:把配置外置、加索引、做数据校验

系统能跑通只是起点,想让它更稳、更快、更好维护,还有几件事值得做。这一章讲三个我实际用下来收益最高的技巧。

第一个是配置外置。把数据库连接参数从代码里挪到配置文件或环境变量,换环境时不用改代码。用configparser读 ini 文件是最简单的做法:

import configparser cfg = configparser.ConfigParser() cfg.read("db.ini", encoding="utf-8") DB_CONFIG = { "host": cfg.get("mysql", "host"), "user": cfg.get("mysql", "user"), "password": cfg.get("mysql", "password"), "database": cfg.get("mysql", "database"), "charset": "utf8mb4", "cursorclass": pymysql.cursors.DictCursor }

这样密码不进代码仓库,部署时只改 ini 文件。参数上,ini 文件记得用 utf-8 保存,否则读中文配置项会出错。

第二个是加索引。学生表如果经常按姓名查询,给name加索引能明显提速:

-- 姓名查询频繁时加索引 CREATE INDEX idx_student_name ON student(name);

逻辑说明:索引让LIKE '张%'这类前缀匹配走索引,但LIKE '%张%'前后都有通配符时索引会失效,这是很多人加了索引却没变快的原因。数据量小的时候索引收益不明显,别盲目加,先看慢查询日志。

第三个是数据校验。界面输入不能全信,年龄要限制范围、电话要校验格式、学号不能为空。我一般在提交前统一校验:

def validate(sno, age, phone): """提交前的基础校验""" if not sno: return "学号不能为空" if not age.isdigit() or not (15 <= int(age) <= 60): return "年龄需在 15 到 60 之间" if phone and not phone.isdigit(): return "电话只能是数字" return None # 返回 None 表示校验通过

逻辑说明:校验放在写库之前,能挡掉大部分脏数据。返回字符串表示错误信息,返回None表示通过,调用处根据返回值决定是否弹提示。参数范围按实际业务调整,这里只是示例。

最后说个我自己的习惯:每次改完代码,先拿一条测试数据走一遍增删改查全流程,确认界面和数据库都对得上,再去加新功能。这个习惯帮我省了无数次「改 A 坏 B」的返工。数据库连接和字符集这两件事,宁可一开始多花十分钟设对,也别等出问题再回头改。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

MySQL反斜杠转义全解析:从字符串插入到LIKE查询的避坑指南

MySQL反斜杠转义全解析:从字符串插入到LIKE查询的避坑指南

先交代一个真实翻车现场。有天业务方发来一张截图&#xff0c;某张配置表里的 Windows 路径字段&#xff0c;原本应该是C:\Users\某应用目录\data\config.ini&#xff0c;结果库里存成了C:Users某应用目录dataconfig.ini&#xff0c;所有反斜杠集体失踪。我一开始以为是应用层写…

2026/10/20 17:19:49 阅读更多 →
电商评论情感分析实战:从数据清洗到BERT蒸馏部署全记录

电商评论情感分析实战:从数据清洗到BERT蒸馏部署全记录

这个项目标题一看就是从实战里踩出来的&#xff0c;数据坑、部署、硬核笔记&#xff0c;说明作者真刀真枪跑过完整链路&#xff0c;不是拿公开数据集跑个demo就完事。文本分类和情感分析在NLP里属于入门必练但做好极难的方向&#xff0c;难就难在数据永远是脏的、标签永远是偏的…

2026/10/20 17:19:49 阅读更多 →
TensorFlow工业级AI工程实践:从计算图到TFX流水线

TensorFlow工业级AI工程实践:从计算图到TFX流水线

1. 这不是“学个框架”那么简单&#xff1a;TensorFlow到底在解决什么问题&#xff1f;很多人第一次听说TensorFlow&#xff0c;是在某次技术分享会上听到“谷歌开源的深度学习框架”&#xff0c;或者在招聘JD里看到“熟悉TensorFlow者优先”。但如果你真去翻它的GitHub仓库、读…

2026/10/20 17:19:49 阅读更多 →

最新新闻

Appium移动端自动化测试环境搭建全攻略:Python+Android+Node.js实战

Appium移动端自动化测试环境搭建全攻略:Python+Android+Node.js实战

1. 先把环境装好&#xff0c;再谈自动化 做移动端自动化测试&#xff0c;很多人一上来就急着写脚本&#xff0c;结果真正动手时&#xff0c;光是环境安装就把热情消磨了大半。Appium Python Android Node.js这套组合&#xff0c;几乎每个部件都有自己的版本要求、环境变量和…

2026/10/20 18:10:34 阅读更多 →
QTTabBar、Office Tab与Quicker:告别Windows多窗口混乱,提升办公效率

QTTabBar、Office Tab与Quicker:告别Windows多窗口混乱,提升办公效率

1. 写在最前面&#xff1a;为什么你的Windows办公效率上不去先问一个问题&#xff1a;你每天要在这台电脑上打开多少个文件夹窗口&#xff1f;要在这几个窗口之间来回切换多少次AltTab&#xff1f;Word、Excel来回改的时候&#xff0c;任务栏上挤了多少个窗口&#xff1f;如果你…

2026/10/20 18:10:34 阅读更多 →
AI短剧创作教程源码包:从剧本到成片的自动化流水线

AI短剧创作教程源码包:从剧本到成片的自动化流水线

简介&#xff1a;AI短剧创作教程源码包&#xff0c;专为希望借助AI工具快速产出短剧的内容创作者与开发者设计。资源围绕AiPy工具&#xff0c;覆盖从故事主题设定、提示词生成剧本&#xff0c;到旁白与分镜头视频制作、人物一致性维护&#xff0c;直至音视频合成出片的完整流程…

2026/10/20 18:10:34 阅读更多 →
本体驱动开发:让AI应用先有一份清晰的领域宪法

本体驱动开发:让AI应用先有一份清晰的领域宪法

最近在整理ontology-driven-dev这个开源项目时&#xff0c;发现一个很有意思的现象&#xff1a;很多人第一眼看到"本体驱动"四个字&#xff0c;要么觉得是学术论文里才有的概念&#xff0c;要么直接把它和知识图谱划等号。但实际上&#xff0c;在做AI原生应用开发的过…

2026/10/20 18:10:34 阅读更多 →
C++利用链表模板类实现简易队列

C++利用链表模板类实现简易队列

前言 队列&#xff08;queue&#xff09;是先进先出&#xff08;first in, first out, FIFO&#xff09;的线性结构&#xff1a;只在尾部插入&#xff0c;只在头部删除。用链表实现队列的好处是插入和删除都是 O(1)&#xff0c;不需要像动态数组那样在头部删除时搬移元素&#…

2026/10/20 18:10:34 阅读更多 →
用Mock测试解决接口依赖问题:从工具选型到落地实践

用Mock测试解决接口依赖问题:从工具选型到落地实践

做接口联调这么多年&#xff0c;最烦的一件事就是“等”。前端等后端接口&#xff0c;后端等第三方服务&#xff0c;测试等环境稳定&#xff0c;最后所有人都在等别人。尤其是前后端并行开发那阵子&#xff0c;接口契约刚定完&#xff0c;前端已经把页面写了一半&#xff0c;后…

2026/10/20 18:09:32 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →