Skip to main content

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)

Source distribution for vibeUI 3.0.0
File Size Uploaded
vibeui-3.0.0.tar.gz 33.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for vibeUI 3.0.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

3.0.0 This release

2 release files

2.0.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page