Violit 是一个新一代 Python Web 框架,它采用 O(1) 状态架构以实现即时响应,这与 Streamlit 的完全脚本重运行结构不同。
构建响应速度如光速、语法最优雅的应用程序。

为什么是Violit?
架构差异
Violit 和 Streamlit 的相似之处在于它们都使用 Python 代码构建用户界面,但它们的内部机制从根本上来说是不同的。
| 特征 | Streamlit(传统) | Violit(响应式) |
|---|---|---|
| 执行模型 | 完全重运行 (O(N)),每次用户交互时重新运行整个脚本。 | 零重新运行 (O(1)),仅更新与已修改状态相连的组件。 |
| 表现 | 随着数据量的增加,响应速度可能会降低。 | 无论数据规模如何,都能保持一致的反应速度。 |
| 优化 | 需要像 @cache 、 @fragment 这样的优化装饰器。 | 设计上已进行优化,无需额外的优化代码。 |
| 部署 | 针对网页浏览器执行进行了优化。 | 同时支持网页浏览器模式和桌面原生应用模式。 |
| 设计 | 专注于提供基本用户界面。 | 提供 30 多个专业主题的即用型设计。 |
主要特点
-
通过设计进行优化(类似 Streamlit 的语法,无复杂性) :保留了 Streamlit 直观的语法,但在架构层面上移除了复杂的优化工具。
-
无需
@cache_data、@fragment、st.rerun:由于 O(1) 结构,无需手动优化。 -
无需
key管理 :无需手动指定小部件状态管理的唯一键。 -
无需复杂的回调函数 :无需像 Dash 或 Panel 那样定义复杂的回调函数/类。
-
-
超快速度 :即使以 0.1 秒的增量移动滑块,图表也能实时反应,不会出现卡顿。
-
混合运行时 :
-
WebSocket 模式 :超低延迟双向通信(默认)
-
精简模式 :基于 HTTP,有利于处理大规模并发连接
-
-
桌面模式 :无需 Electron 即可使用
--native选项作为完美的桌面应用程序运行。
主题画廊
你完全不需要懂 CSS。Violit 提供了超过 30 个主题。(不久之后,用户将能够轻松添加自定义主题。)
# Configuration at initialization
app = vl.App(theme='cyberpunk')
# Runtime change
app.set_theme('ocean')
| 主题家族 | 示例 |
|---|---|
| 黑暗 | dark 、 dracula 、 monokai 、 ocean 、 forest 、 sunset |
| 阳光 | light 、 pastel 、 retro 、 nord 、 soft_neu |
| 科技 | cyberpunk 、 terminal 、 cyber_hud 、 blueprint |
| 专业 | editorial 、 bootstrap 、 ant 、 material 、 lg_innotek |
基准测试与性能
基准测试结果表明,Violit 的 O(1) 更新方法与现有的 O(N) 方法相比效率更高。
对比
Python UI 框架
| Framework | Architecture | Learning Curve | Performance | Desktop App | Real-time |
|---|---|---|---|---|---|
| Streamlit | Full Rerun | Very Easy | Slow | ❌ | △ |
| Dash | Callback | Medium | Fast | ❌ | △ |
| Panel | Param | Hard | Fast | ❌ | ✅ |
| Reflex | React (Compile) | Hard | Fast | ❌ | ✅ |
| NiceGUI | Vue | Easy | Fast | ✅ | ✅ |
| Violit | Signal | Very Easy | Fast | ✅ | ✅ |
代码比较
1. 与 Streamlit 对比 (Rerun 与 Signal)
Streamlit 在按钮点击时会重新执行整个脚本 ,但 Violit 只会执行该函数 。
# Streamlit
import streamlit as st
if "count" not in st.session_state:
st.session_state.count = 0
if st.button("Click"):
st.session_state.count += 1 # Rerun triggers here
st.write(st.session_state.count)
# Violit
import violit as vl
app = vl.App()
count = app.state(0)
# Update only count on click (No Rerun)
app.button("Click", on_click=lambda: count.set(count.value + 1))
app.write(count)
2. vs Dash (回调地狱 vs 自动响应)
Dash 需要复杂的回调函数来连接输入/输出,但 Violit 只需要一个状态 。
# Dash
from dash import Dash, html, Input, Output, callback
app = Dash(__name__)
app.layout = html.Div([
html.Button("Click", id="btn"),
html.Div(id="out")
])
# Violit
count = app.state(0)
app.button("Click", on_click=lambda: count.set(count.value + 1))
# Automatic state dependency tracking -> No Callback needed
app.write(lambda: f"Value: {count.value}")
3. 与 NiceGUI 的比较 (绑定 vs 直接状态)
NiceGUI 也很棒,但 Violit 提供了类似 Streamlit 的更简洁的语法 。
# NiceGUI
from nicegui import ui
count = {'val': 0}
ui.button('Click', on_click=lambda: count.update(val=count['val'] + 1))
ui.label().bind_text_from(count, 'val', backward=lambda x: f'Value: {x}')
# Violit
count = app.state(0)
app.button('Click', on_click=lambda: count.set(count.value + 1))
app.write(count) # No need for complex connections like .bind_text
4. 与 Reflex 的对比 (类编译 vs 纯 Python)
Reflex 需要定义和编译 State 类,但 Violit 是一个纯 Python 脚本。
# Reflex
import reflex as rx
class State(rx.State):
count: int = 0
def increment(self):
self.count += 1
def index():
return rx.vstack(
rx.button("Click", on_click=State.increment),
rx.text(State.count)
)
# Violit
# No class definition needed, no compilation needed
count = app.state(0)
app.button("Click", on_click=lambda: count.set(count.value + 1))
app.write(count)
快速入门
1. 安装
可安装在 Python 3.10+ 环境中。
pip install violit
# Or development version
pip install git+https://github.com/violit-dev/violit.git
2. 你好,Violit!
创建一个名为 hello.py 文件。
import violit as vl
app = vl.App(title="Hello Violit", theme='ocean')
app.title("Hello, Violit!")
app.markdown("Experience the speed of **Zero Rerun**.")
count = app.state(0)
col1, col2 = app.columns(2)
with col1:
app.button("➕ Plus", on_click=lambda: count.set(count.value + 1))
with col2:
app.button("➖ Minus", on_click=lambda: count.set(count.value - 1))
app.metric("Current Count", count)
app.run()
3. 执行
# Basic run (WebSocket Mode)
python hello.py
# Desktop App Mode (Recommended)
python hello.py --native
# Port configuration
python hello.py --port 8020
小部件支持
Violit 支持 Streamlit 核心组件,并且一些功能经过重新设计,效率更高。
有关详细的兼容性列表和不支持的小部件信息,请参阅
技术栈
-
后端 :FastAPI(异步 Python)
-
前端 :Web Components(Shoelace)、Plotly.js、AG-Grid
-
协议 :WebSocket 和 HTTP/HTMX 混合协议
-
状态 :基于信号的反应式
路线图
Violit是不断演变的。
-
✅ 核心 :信号状态引擎、主题系统
-
✅ 小部件 :Plotly、数据框、输入小部件
-
⏳ 主页 :官方主页可打开
-
⏳ 文档 :官方技术文档和 API 参考更新
-
⏳ 自定义组件 :用户自定义组件支持
-
⏳ 自定义主题 :支持用户自定义主题
-
⏳ async :支持异步处理
-
⏳ 更多示例 :提供更多实际可用的示例代码
-
⏳ Violit.Cloud :云部署服务
-
⏳ 扩展 :集成更多第三方库
📂 项目结构
.
├── violit/ # Framework source code
│ ├── app.py # Main App class and entry point
│ ├── broadcast.py # Real-time WebSocket broadcasting
│ ├── state.py # Reactive State Engine
│ ├── theme.py # Theme management
│ ├── assets/ # Built-in static files
│ └── widgets/ # Widget implementations
│ ├── input_widgets.py
│ ├── data_widgets.py
│ ├── layout_widgets.py
│ └── ...
└── requirements.txt # Dependency list
https://github.com/violit-dev/violit