Options for developing GUI standalone app

A lot of what I’ve used Julia for so far has been data analysis with Jupiter or Pluto, or writing command line scripts. Now I want to develop a tool for measuring network performance under various conditions. It should have some simple text boxes and check marks and things, a button that says “go” and then generate some traffic and do some statistical analysis and generate some statistical graphics.

In particular the users of this thing will not be programmers and do not want to call functions or etc so a notebook style doesn’t seem appropriate (maybe a separate notebook for analyzing the saved data though)

What are some options for making relatively simple gui like this in Julia? Something where I don’t have to become much of a JavaScript/html web programmer to use it. Also how to structure this project? Its not a “Package” is there a standard way to structure a thing like this? For example it would be nice to make it run on Linux, Windows, or Mac. Doesn’t have to be a clickable gui icon, just easy to invoke without being a Julia programmer.

1 Like

For the GUI part I would recommend GitHub - Gnimuc/CImGui.jl: Julia wrapper for cimgui

1 Like

I recently wrote a simple graphical app with integrated plots using QML.jl, and found it to be relatively straightforward. With QtCreator, there is in principle a graphical IDE to create the qml file, but I found it unusable due to constant crashing.
Gtk.jl and CImGui.jl are two other reasonable options.

1 Like

Thanks for those suggestions!

I was looking at Interact.jl with the Mux.jl framework, so Jupyter is not needed. The main GUI features needed are things like text entry, check boxes, and buttons, and a few sliders to zoom the graphs.

Basically you’ll choose from a menu of network probes to perform (generating different kinds of traffic) you’ll enter a machine/ip address, and a duration, and click “go”… after the end of the experiment it will plot various time-series and things. Having those plots be in Vega would be great, because I like that plotting framework.

I like the idea of having it in the browser if only because cross platform and web-based plotting frameworks. But only if I can avoid learning a crapload of CSS and DOM and etc. Does anyone have a link to some example project about of that complexity?

I played with Gtk, CimGUI and Dash. Out of the three, I think Gtk has shallowest learning curve for what you need. Here’s and example I posted a while ago: Julia Package for UI development - #3 by Iulian.Cioarca

If you want fast refresh rate I recomment CimGUI. I used if for developing a GUI frontend for USB oscilloscopes:[ANN] CImGui.jl - A Wrapper for Bloat-free Immediate Mode Graphical User interface(Dear ImGui) - #29 by Iulian.Cioarca
It’s also a good oportunity to learn about immediate mode GUIs. Some widgets are not directly available: for example I had to implement my own toggle button using a struct to store state and modify the color. It’s also tricky to modify the scale of the widgets or the font size.

Dash is also rewarding and I’m starting to like it more and more: Embed local image in Dash app with HTTP?. You have a lot of flexibility, but you need to tinker a bit more and it’s a bit more verbose. I think all the functionality of Plotly Dash was wrapped, including tables.

2 Likes

Possibly QML.jl and GTK.jl are worth exploring?

-viral

1 Like

You are correct. You don’t technically need to develop a “Package”, but you should (at a minimum) create a “Project/Environment” for your application. That way, you can ensure your app will execute correctly - especially if you include the Manifest.toml file. Of course, including a Manifest.toml (project) file also means the user gets locked to the exact solution you specify (will not get updates of dependencies).

To help users run your application on their own system, I suggest:

ConventionalApp.jl

And despite the fact that you don’t need to develop a package, I still suggest you do. I made a conscious decision with ConventionalApp.jl to treat application repositories as a package. Though your app-package does not need to be published in Julia’s General registry, I found it easier for the users to operate on their apps if they are treated as “packages”.

That’s because Julia’s Pkg.jl provides functions & objects that simplify how we access & manipulate packages. For example, a user can add http://url/to/MyPackage.jl to make Julia aware of any github-hosted package. Then, you can call using MyPackage to load it while simultaneously creating a MyPackage module object.

In contrast, Julia’s (non-package) project/environment toolset is not as extensive. ConventionalApp.jl only uses it to setup the active “Julia environment”, making sure the right set of packages are available to your application. (And cleans up the LOAD_PATH to its minimal useful state).

Limitations

I created ConventionalApp.jl out of needs similar to yours. It is a very basic package, but the solution is not completely ironed out. Like I mentioned in my [ANN] post: I feel like I am missing a simpler solution staring me in the face, but I have not yet found it.

But even if this truly is the right way to go, the solution will likely need to be adjusted once people start using it. So feel free to open PRs.

1 Like

What you ask for looks like it can be done with old plain HTML from the Netscape days. No need for JS & DOM, just some basic HTML (most of) which can be generated by some free tool.

indeed, but I do want interactivity in the graphics… once you’ve “run” a session, you should be able to click different analyses to show different plots, zoom into certain regions of the time-history, etc So I don’t think it’s just “submit” and then “view the results”. It’s this interactivity that makes it more complicated to me.

It does seem like “Interact.jl” gives this kind of thing. I think I’ll start there, because a desktop app with its own window and I draw graphics in it is not really what i want.