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.
I tried using TK with a Port via TCL and while this works OK there is a slight overhead of me having to ship TCL/TK binaries with the Elixir Release.
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/[https://sourceforge.net/projects/yad-dialog/ [.badge .badge-notification .clicks]#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
end
end
Usage Example
image:/images/blog/old_uploads/zenity-usage-elixir.png[image]
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.