查看: 136|回复: 3

使用FastAPI + Vue 3 + SQLite构建Web端GUI设计工具并一键导出Tkinter代码

[复制链接]
发表于 8 小时前 | 显示全部楼层 |阅读模式
对于Python桌面GUI开发,Tkinter依然是许多初学者的首选框架。但手动布局每个控件(按钮、输入框、标签)并设置坐标和尺寸,不仅繁琐且容易出错。为了解决这一问题,我基于FastAPI、Vue 3和SQLite开发了一套全栈图形界面设计工具,用户可在浏览器中注册登录、创建GUI设计项目、添加和编辑控件,并一键导出可运行的Tkinter原型代码。

一、技术栈与架构
项目采用前后端分离架构:
- 后端:Python 3 + FastAPI + SQLAlchemy + Pydantic
- 数据库:SQLite(适合教学和小型工具)
- 前端:Vue 3 + Vite + Composition API
- 认证:密码哈希(bcrypt)+ 随机Token + Bearer鉴权
- 核心模块:用户认证、项目CRUD、控件属性管理、Tkinter代码生成

前端通过Vue 3管理页面状态和画布预览;FastAPI提供RESTful API;SQLite持久化用户、令牌、项目和控件数据;代码生成逻辑独立于crud.py中,便于后续扩展至PyQt或CustomTkinter。

二、数据库模型设计
项目包含四张核心表,通过SQLAlchemy ORM实现一对多关系:
1. users:id、username(唯一)、email(唯一)、password_hash、created_at
2. auth_tokens:id、token(随机字符串)、user_id、created_at
3. design_projects:id、name、description、canvas_width/canvas_height、platform(如Tkinter)、owner_id
4. ui_components:id、project_id、type(Button/Label等)、text、x/y坐标、width/height、props(JSON扩展属性)

三、后端核心接口
后端提供以下接口(部分需Bearer Token认证):
- GET /api/health:健康检查
- POST /api/auth/register:注册
- POST /api/auth/login:登录
- POST /api/auth/logout:退出登录
- GET /api/me:获取当前用户
- GET/POST/PUT/DELETE /api/projects:项目CRUD(仅操作用户自己的数据)
- GET /api/projects/{project_id}/export:导出Tkinter代码

四、核心代码实现
1. 数据库连接(backend/app/database.py)
  1. SQLALCHEMY_DATABASE_URL = "sqlite:///./gui_designer.db"
  2. engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
  3. SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  4. def get_db():
  5.     db = SessionLocal()
  6.     try:
  7.         yield db
  8.     finally:
  9.         db.close()
复制代码

2. 密码哈希与Token生成(backend/app/crud.py)
使用passlib的bcrypt算法处理密码,登录成功后用secrets.token_urlsafe(32)生成随机Token并存入数据库。
  1. from passlib.context import CryptContext
  2. pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
  3. def hash_password(password: str) -> str:
  4.     return pwd_context.hash(password)
  5. def verify_password(password: str, password_hash: str) -> bool:
  6.     return pwd_context.verify(password, password_hash)
复制代码

3. FastAPI鉴权依赖(main.py)
通过Header中的Bearer Token查找用户,未通过则返回401。
  1. def get_current_user(authorization: str = Header(default=""), db: Session = Depends(get_db)):
  2.     if not authorization.startswith("Bearer "):
  3.         raise HTTPException(status_code=401, detail="未登录或token格式错误")
  4.     token = authorization.replace("Bearer ", "", 1).strip()
  5.     user = crud.get_user_by_token(db, token)
  6.     if not user:
  7.         raise HTTPException(status_code=401, detail="登录已过期")
  8.     return user
复制代码

4. Tkinter代码生成
根据控件类型和属性动态生成place()布局代码:
  1. widget_map = {
  2.     "Button": "tk.Button(root, text={text!r})",
  3.     "Label": "tk.Label(root, text={text!r})",
  4.     "Entry": "tk.Entry(root)",
  5.     "Text": "tk.Text(root)",
  6.     "Combobox": "ttk.Combobox(root, values=['选项A', '选项B'])",
  7. }
  8. # 每个控件生成类似代码:
  9. widget_1 = tk.Button(root, text='登录')
  10. widget_1.place(x=220, y=160, width=120, height=36)
复制代码

5. Vue 3鉴权请求封装(frontend/src/api.js)
统一从本地存储获取Token并添加到请求头,业务代码无需重复编写fetch细节。
  1. const token = getToken()
  2. if (token) headers.Authorization = `Bearer ${token}`
复制代码

五、前端功能与界面
Vue 3包含以下核心页面:
- 登录/注册卡片:提交用户名、邮箱、密码,成功后保存Token。
- 项目侧边栏:展示用户所有GUI项目,支持新建。
- 设计器工具栏:编辑项目名称、目标平台、保存、导出、删除。
- 控件工具箱:一键添加Button、Label、Entry、Text、Combobox。
- 画布区域:绝对定位展示控件,模拟设计器布局。
- 属性面板:选中控件后修改文本、坐标、宽高。
- 代码预览层:调用后端export接口显示生成的Tkinter代码。

六、部署与运行
1. 启动后端:
  1. cd project/backend
  2. python3 -m venv .venv
  3. source .venv/bin/activate
  4. pip install -r requirements.txt
  5. uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
复制代码

2. 启动前端:
  1. cd project/frontend
  2. npm install
  3. npm run dev
复制代码

3. 使用流程:
- 打开前端页面(默认http://127.0.0.1:5173)。
- 注册用户(例如demo / demo@example.com / 123456)。
- 登录后点击“新建设计”。
- 添加和编辑控件后点击“保存”。
- 点击“导出代码”,复制生成的Tkinter代码到.py文件运行。

七、项目扩展方向
- 支持拖拽移动控件,取代纯坐标输入。
- 增加控件树、图层、对齐线和网格吸附。
- 导出PyQt、CustomTkinter、Kivy等框架代码。
- 项目版本管理和模板市场。
- 多人协作设计与实时预览。

通过该项目可以学习如何设计前后端分离的Python全栈应用、保护核心接口、将业务数据转化为可运行代码,以及用Vue 3快速搭建具有真实业务交互的工具型产品。
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层

Re: 使用FastAPI + Vue 3 + SQLite构建Web端GUI设计工具并一键导出Tkinter代码

这个工具的思路很实用,把繁琐的Tkinter布局通过可视化界面生成,降低了初学者的入门门槛。技术栈选型也比较轻量,FastAPI + SQLite 适合教学和小型项目,前后端分离也方便后期扩展。 想请教一下,Vue 3 前端在处理画布拖拽和位置同步时,是直接操作 DOM 坐标还是通过 Canvas 实现?导出代码里控件的 place() 位置和前端显示是否做了单位换算(比如像素转 Tkinter 的像素单位)?另外,如果后续想支持 CustomTkinter 或 PyQt 的导出,代码生成部分的抽象层大概需要怎么调整? 整体来说,这个项目对想学 Tkinter 但又不愿手动调坐标的人很有帮助,期待后续能开源或分享更多实现细节。
回复 支持 反对

使用道具 举报

发表于 5 小时前 | 显示全部楼层

Re: 使用FastAPI + Vue 3 + SQLite构建Web端GUI设计工具并一键导出Tkinter代码

这个项目思路很有意思,把Web端拖拽设计转化为Tkinter代码,确实能帮新人省掉手动调坐标的麻烦。我比较关心代码生成部分——目前生成的控件只包含布局和基本属性,有没有预留事件绑定的接口?比如按钮点击的回调函数是让用户后续自己写,还是会在导出时生成一个空的callback框架?另外,如果未来想支持其他平台(比如PyQt),你的代码生成器架构能否方便地扩展?期待能看到更完整的演示或源码分享。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: 使用FastAPI + Vue 3 + SQLite构建Web端GUI设计工具并一键导出Tkinter代码

这个工具想法很棒,对于刚学Tkinter的新手来说确实能省不少事。我比较好奇的是,前端的画布预览是直接模拟了Tkinter的place布局,还是只是大致占位?因为不同控件实际渲染出来的尺寸可能和设置的不完全一致,导出后会不会出现位置偏移的问题?另外,项目有开源计划吗?想看看代码生成那块具体怎么组织。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-17 17:00 , Processed in 0.045071 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部