A Flutter-like Python Web Framework
Build beautiful web UIs using pure Python with a Flutter-style API. No HTML, CSS, or JavaScript knowledge required!
Container, Row, Column, Text, Button, etc.index.html + dreamweb.jsHtml() and Css() widgetspip install dreamweb
from dreamweb import App
from dreamweb.common import *
class CounterApp(App):
def __init__(self):
super().__init__()
self.count = State(0)
def build(self):
return Container(
width="100%",
height="100vh",
background="gradient-purple-pink",
align="center",
justify="center",
children=[
Container(
width=400,
padding=40,
background="white",
rounded=16,
shadow="xl",
children=[
Text(
"Counter App",
size="2xl",
weight="bold",
color="gray-900"
),
Text(
f"Count: {self.count.value}",
size="xl",
color="gray-700"
),
Row(
spacing=10,
children=[
Button(
text="Increment",
color="blue",
size="lg",
on_click=lambda: self.count.set(self.count.value + 1)
)
]
)
]
)
]
)
if __name__ == "__main__":
CounterApp().run(dev=True)
python main.py
Visit http://localhost:8000 to see your app! 🎉
Container(width, height, padding, margin, background, border, rounded, shadow)Row(spacing, align, justify, wrap)Column(spacing, align, justify)Stack(children)Center(child)Spacer(size)Text(text, size, weight, color, align, italic, underline)Heading(text, level, color, weight)Button(text, color, size, variant, rounded, icon, on_click)TextField(placeholder, value, type, on_change)Checkbox(checked, label, on_change)Radio(checked, label, name, value, on_change)Select(options, value, placeholder, on_change)Slider(value, min, max, step, on_change)ApiRequest(url, method, headers, body, on_success, on_error, on_loading)FetchData(url, on_success, on_error) - Simplified GET requests# Example: Fetch data from an API
FetchData(
url="https://api.github.com/users/octocat",
on_success=lambda data: self.user.set(data),
on_error=lambda error: print(error)
)
Image(src, width, height, fit, rounded)Video(src, controls, autoplay, loop)Icon(name, size, color)Link(text, to, color, underline)Html(html="<div>...</div>")Css(css=".class { color: red; }")All styling is done through widget parameters:
Use named colors or hex values:
"primary", "secondary", "success", "danger", "warning", "info""red", "blue", "green", "purple", "pink", etc."#FF5733""gradient-purple-pink", "gradient-blue-purple""xs", "sm", "md", "lg", "xl", "2xl", "3xl", "4xl""sm", "md", "lg", "xl""sm", "md", "lg", "xl", "2xl"size=24)# Single value (all sides)
padding=20
# Dictionary (specific sides)
padding={'top': 10, 'right': 20, 'bottom': 10, 'left': 20}
from dreamweb import App
from dreamweb.common import *
class MyApp(App):
def __init__(self):
super().__init__()
self.counter = State(0)
self.name = State("John")
def increment(self):
self.counter.set(self.counter.value + 1)
def build(self):
return Text(f"Count: {self.counter.value}")
# In your app file, change dev=True to dev=False
if __name__ == "__main__":
MyApp().run(dev=False)
This will create a build/ directory with:
index.html - Your app’s HTMLdreamweb.js - Compiled and minified JavaScriptCheck the examples/ directory for:
hello_world.py - Simple hello worldcounter_app.py - Counter with statetodo_app.py - Full todo applicationapi_example.py - Fetch data from GitHub APIapi_post_example.py - POST requests with form dataapi_demo.html - Interactive API demo| Feature | DreamWeb | Flutter Web | Flet |
|---|---|---|---|
| Language | Python | Dart | Python |
| Learning Curve | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| Hot Reload | ✅ | ✅ | ✅ |
| Output | HTML/JS | WASM | WebSocket |
| Styling | Parameters | Parameters | Parameters |
| Raw HTML/CSS | ✅ | ❌ | ❌ |
Contributions are welcome! Please feel free to submit a Pull Request.
MIT License - feel free to use this in your projects!
Made with ❤️ by the DreamWeb team