vibeUI
vibeUI is a beginner-friendly Python framework for building desktop applications, on top of Tkinter.
- v1: Make Tkinter easier.
- v2: Make Tkinter modern.
- v3: Make building desktop applications pleasant.
No pixel math, no StringVar juggling, no theming headaches — just describe what you want.
import vibe as vi
win = vi.Window("My App", theme="dark", accent="#7c6cf5")
name = vi.State("world")
win.add_label(text=lambda: f"Hello, {name.value}!", size="xl", bold=True)
win.add_input(value=name)
with win.row():
win.add_button("Say hi", on_click=lambda: vi.alert(f"Hi {name.value}!"))
win.add_button("Reset", variant="secondary", on_click=lambda: name.set("world"))
win.run()
Why vibeUI over raw Tkinter?
Raw Tkinter makes you: place widgets with manual x, y coordinates or juggle
pack/grid/place yourself; manage StringVar/BooleanVar/DoubleVar
plumbing for every input; hand-roll hover states and theming; and write your
own validation, notifications, and dialogs from scratch. vibeUI does all of
that for you, while still being Tkinter underneath — no new runtime, no
heavy dependencies, and an escape hatch (.widget) to raw Tkinter whenever
you need it.
Installation
pip install vibeUI
Optional, for resizable/JPEG images (add_image(..., width=..., height=...)):
pip install "vibeUI[images]"
Tkinter ships with most Python installs. On some Linux distros you may need
sudo apt install python3-tk first.
Quick Start
import vibe as vi
win = vi.Window("Vibe Demo", size=(500, 400), theme="dark", accent="#7c6cf5")
win.add_label("Hello, Vibe!", size="xl", bold=True)
name = win.add_input("Enter your name")
def greet():
vi.alert(f"Hello {name.get() or 'friend'}!", title="Greeting")
win.add_button("Greet Me", on_click=greet)
win.run()
Run any of the bundled examples:
python examples/hello_world.py
python examples/dashboard.py
python examples/state_demo.py
See examples/ for: hello_world, calculator, login, settings, todo,
dashboard, form, file_manager, chat, theme_demo, responsive_demo,
state_demo.
Layout
Widgets stack automatically. Group them with row(), column(), grid(),
card(), sidebar(), navbar(), modal(), or accordion():
with win.row(gap=12, align="center"):
win.add_button("Save")
win.add_button("Cancel")
with win.grid(columns=3, gap=12):
for i in range(6):
with win.card(title=f"Item {i}"):
win.add_label("...")
Full reference: docs/layout.md.
Reactive state
count = vi.State(0)
win.add_label(text=lambda: f"Clicked {count.value} times")
win.add_button("+1", on_click=lambda: count.set(count.value + 1))
Labels re-render automatically when a State they read changes; inputs,
checkboxes, sliders, and dropdowns support two-way value=state binding.
Full reference: docs/state.md.
Theming
vi.create_theme(name="cyber", background="#0b0b0f", surface="#15151c",
text="#ffffff", accent="#00ffcc")
win.set_theme("cyber") # every widget re-colors instantly, no restart
Built-in: light, dark, ocean. Full reference: docs/themes.md.
Forms & validation
form = vi.Form()
email = win.add_input("Email")
form.add_field("email", email, required=True, pattern=r".+@.+\..+")
if form.is_valid():
...
else:
print(form.errors)
Widgets
Labels, headings, buttons (4 variants + icons), text inputs & search inputs
(with real placeholders and password masking), text areas, checkboxes,
switches, radio groups, sliders, spinboxes, dropdowns/comboboxes, listboxes,
a simple data table, progress bars, images, links, badges, tooltips, tabs, a
menu bar, and a status bar. Every interactive widget returns a consistent
wrapper with .get()/.set()/.on_change(...). Full reference:
docs/widgets.md.
Dialogs & notifications
vi.alert(), vi.confirm(), vi.prompt(), vi.choose_file(),
vi.choose_folder(), vi.save_file(), vi.pick_color(), and a non-blocking,
stacking vi.toast(message, type="success") (info/success/warning/error).
Keyboard shortcuts
win.bind_shortcut("Ctrl+S", save)
win.bind_shortcut("Escape", win.close)
Window management
win.center(); win.maximize(); win.minimize(); win.fullscreen()
win.set_min_size(400, 300); win.on_close(confirm_before_closing)
Custom widgets
class RatingStars(vi.Widget):
def build(self, container, theme):
... # build your Tkinter widget tree, return the outer widget
win.add_widget(RatingStars())
Full guide: docs/custom_widgets.md.
Debugging layouts
win.debug_layout() # outlines every container so you can see how things nest
Off by default; never affects a shipped app unless you call it yourself.
Cross-platform support
vibeUI targets Windows, macOS, and Linux — anywhere Tkinter runs. Window
management methods (maximize, fullscreen, etc.) use platform-appropriate
Tk calls with graceful fallbacks where window managers differ (notably
maximize() on some Linux window managers). If you hit a platform-specific
issue, please open an issue with your OS and Python version.
Optional dependencies
vibeUI's only hard requirement is Python's standard library (Tkinter). The
images extra (pip install vibeUI[images]) adds Pillow
for image resizing and broader format support — without it, add_image()
still works for PNG/GIF via Tkinter's built-in PhotoImage.
Migrating from v2
See docs/migration_v2.md — almost everything is
backward compatible; the few breaking changes are documented there.
Testing
pip install pytest
pytest # Windows/macOS with a desktop session
xvfb-run -a pytest # Linux without a display
License
vibeUI is released under the MIT License.
Author
Created and maintained by Samarth Chugh (@Sam3360).
Metadata
Release files for vibeUI 3.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| vibeui-3.0.0.tar.gz | 33.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| vibeui-3.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 61.8 kB
Release files / vibeui-3.0.0.tar.gz
| Download URL | vibeui-3.0.0.tar.gz |
|---|---|
| Size | 33.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
afd9e4973bc12d6a14df5ec5cffc030851a7de43cda61da9ad8c9992d30e8b89
|
|
BLAKE2b-256 checksum How to use checksums |
3cbfc5646464cb8c7c0443557b8f918aa59ddcfe9fc21b20f5dc7c9b502bc6bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|
Release files / vibeui-3.0.0-py3-none-any.whl
| Download URL | vibeui-3.0.0-py3-none-any.whl |
|---|---|
| Size | 28.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
76063bc848bce03dd062d7488b8ea22d8353bd57ee21d2ded50980c437445ab5
|
|
BLAKE2b-256 checksum How to use checksums |
5c4c86e30f6235cc53ca6b034b96bd5353737912a29f58ba61ce26e7f07c13d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|