Zenity GUI for Elixir

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.

Subscribe to my Newsletter

Receive emails about Linux, Programming, Automation, Life tips & Tricks and information about projects I'm working on