# What's the best GUI library for doing asynchronous work?

**URL:** <https://discourse.julialang.org/t/whats-the-best-gui-library-for-doing-asynchronous-work/128525>\
**Category:** General Usage\
**Tags:** gui, serial\
**Created:** [April 29, 2025, 1:28pm UTC](https://discourse.julialang.org/t/whats-the-best-gui-library-for-doing-asynchronous-work/128525 "2025-04-29T13:28:56Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)\
**Post date:** [April 29, 2025, 1:28pm UTC](https://discourse.julialang.org/t/whats-the-best-gui-library-for-doing-asynchronous-work/128525/1 "2025-04-29T13:28:56Z")

</div>

I’m making a GUI to control a robot over serial and I want to be able to use buttons and text fields to control asynchronous loops that send and receive data over serial.

What GUI library makes this easiest? There seem to be a lot of GUI libraries that all work in very different ways.

---

<div class="post-metadata">

**Author:** ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)\
**Post date:** [May 12, 2025, 5:49pm UTC](https://discourse.julialang.org/t/whats-the-best-gui-library-for-doing-asynchronous-work/128525/2 "2025-05-12T17:49:25Z")

</div>

I chose Tk.jl because it seemed simple and had individual event handlers for pushing and releasing a button and it was terrible. Tk.jl segfaults when you try to multi-thread with it.

---

<div class="post-metadata">

**Author:** ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)\
**Post date:** [June 3, 2025, 9:13pm UTC](https://discourse.julialang.org/t/whats-the-best-gui-library-for-doing-asynchronous-work/128525/3 "2025-06-03T21:13:30Z")

</div>

The real solution here is to use StableTasks.jl `@spawnat` to guarentee thread safety when talking to Tk.jl.

---

<div class="post-metadata">

**Author:** ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)\
**Post date:** [June 3, 2025, 9:17pm UTC](https://discourse.julialang.org/t/whats-the-best-gui-library-for-doing-asynchronous-work/128525/4 "2025-06-03T21:17:30Z")

</div>

I’m using QML.jl now and it seems far more versatile(but much harder to learn and requires that you also know javascript) and has explicit support for observables but is also not thread safe.

---

<div class="post-metadata">

**Author:** ![sdanisch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sdanisch/32/1406_2.png) [@sdanisch](https://discourse.julialang.org/u/sdanisch)\
**Post date:** [June 3, 2025, 9:21pm UTC](https://discourse.julialang.org/t/whats-the-best-gui-library-for-doing-asynchronous-work/128525/5 "2025-06-03T21:21:43Z")

</div>

People have created pretty complex UIs like this with makie 😉

> **[Redirecting](https://makie.org/)**

E.g. [GUI explanation · TempestSDR.jl](https://juliatelecom.github.io/TempestSDR.jl/dev/gui/#How-the-GUI-works)

---

<div class="post-metadata">

**Author:** ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)\
**Post date:** [June 4, 2025, 9:00am UTC](https://discourse.julialang.org/t/whats-the-best-gui-library-for-doing-asynchronous-work/128525/6 "2025-06-04T09:00:18Z")

</div>

I did consider that, and it probably is the easiest and most robust way to do this, but I was unhappy with how messy the layout was with GLMakie.jl, at least I couldn’t figure out how to make text and other elements properly align.

But I definitely should have prototyped my project in GLMakie.jl in stead of in Tk.jl.

---

<div class="post-metadata">

**Author:** ![jules](https://avatars.discourse-cdn.com/v4/letter/j/41988e/32.png) [@jules](https://discourse.julialang.org/u/jules)\
**Post date:** [June 4, 2025, 9:48am UTC](https://discourse.julialang.org/t/whats-the-best-gui-library-for-doing-asynchronous-work/128525/7 "2025-06-04T09:48:02Z")

</div>

Do you have an example for a such a messy layout? Always happy to solve people’s alignment problems 😃
