So I’ve recently switched to using Elixir as my main development
platform.
One drawback of Elixir/Erlang is that it doesn’t have any GUI(General
User interface).
Yes, it’s easy - even required - to use cowboy + plug or Phoenix to make
a browser based (HTML, CSS and JavaScript) interface that works great
across all devices.
But what when you want to interact with the user directly without the
extra overhead?
Well, you can make bindings to GTK+, TK or QT! Search for a library that uses those and use it.
But why not something simple?
You can use Zenity for simple interactions. It works on Linux, there is a port for Windows and one for MacOsX.
UPDATE: Zenity is cool for fast prototyping, the sad part is that it’s development has stopped.
I recommend newcomers to try yad out (https://sourceforge.net/projects/yad-dialog/29]), it’s a Zenity fork. You can usually find it in the package manager.
Sample Zenity module
defmodule Zenity do@zenity "/usr/bin/zenity" def entry(text,entry_text \\\\ "") do exec @zenity, ["--entry", "--text",text, "--entry-text",entry_text] end def exec(exe, args) when is_list(args) do port = Port.open({:spawn_executable, exe}, [{:args, args} , :stream, :binary, :exit_status, :hide, :use_stdio, :stderr_to_stdout]) handle_output(port) end def handle_output(port, data \\\\"") do receive do {^port, {:data, data}} -> handle_output(port,data) {^port, {:exit_status, status}} -> {data, status} end endend
Usage Example
Official documentation:
I have compiled a few links with official documentation and examples.
https://help.gnome.org/users/zenity/3.22/
More examples:
http://linux.byexamples.com/archives/259/a-complete-zenity-dialog-examples-1/
https://www.linux.org/threads/zenity-gui-for-shell-scripts.9802/
https://linuxaria.com/howto/introduction-zenity-bash-gu
Conclusion
Zenity is worthy of usage within Elixir in the creation of user oriented
scripts. And it works great in prototyping new apps.
It can do many things. For more advanced experiments and real software,
consider using Phoenix in the browser.