3. Adding a GUI interface to a bash script


GUI interfaces can be used with bash scripts. The script below uses Zenity to provide a GUI dialog for selecting an image to convert to .pdf, a second GUI dialog for naming and saving the newly created .pdf file and a third offering the option to delete the image file used to create the .pdf file.

#!/bin/bash
############################################################
# con2pdf-gui
# Intended to convert scanned document to pdf document 
# and provides gui interface for file selection.
# requires awk
# requires convert (from ImageMagick)
# requires dirname
# requires zenity to create gui file selection dialogs
# zenity requires GTK+
############################################################
 
 
input_file=`zenity --file-selection --title="Select an image file to convert to pdf"`
 
	if [ $? -eq 1 ]; then
        	exit
    	fi
 
working_dir=$(dirname $input_file)
 
cd $working_dir
 
output_file=`zenity --file-selection --save --title="Save .pdf file as..." --confirm-overwrite`
 
	if [ $? -eq 1 ]; then
		exit
	fi
 
convert $input_file $output_file
 
zenity --question --text="Do you want to delete the image file before you exit?"
 
	case $? in
		0) rm $input_file;;
 
		1) exit;;
	esac
 
# end of script

This script could be run by clicking an icon on a desktop and since the interface is GUI there would be no need to open a terminal.

input_file=`zenity --file-selection --title "Select an image file to convert to pdf"`

The first line of this script uses a zenity command within two backticks to assign a file to the variable input_file. The option file-selection specifies that a file selection dialog box is required. The option –title will create a title for the dialog using the text enclosed in double quotes. If the user is running this script from an icon on the desktop, The file selection dialog will open into /home/[user-directory].

The script con2pdf in Section 1 either converted an image to a .pdf if a target image file was entered after the command con2pdf or it printed out the usage message and then returned to the command prompt if no target file was entered. However, in the zenity file selection dialog there are two user options, select a file or Cancel. It is necessary after this zenity command executes to check the exit code to see if the user has hit *Cancel* in which case the exit code would be 1. The following if statement should look familiar.

	if [ $? -eq 1 ]; then
        	exit
    	fi

If a file has been selected and the user has pressed OK the script will continue on to the next line after the if statement This line creates the variable working_dir and assigns it the path of $input_file using the command dirname. This variable is then used to cd into the target file's directory. That directory now becomes the script's pwd and the next zenity command will open a file selection dialog in that directory.

working_dir=$(dirname $input_file)
 
cd $working_dir

Next the script creates a variable, output_file. This zenity command is also a file selection dialog. The –save option is used even though the script is creating a variable and not saving a file so that the –confirm-overwrite option can be used. This is necessary because the command convert will overwrite files without warning.

Another if statement is required in case the user hits the *Cancel* button.

output_file=`zenity --file-selection --save --title="Save .pdf file as..." --confirm-overwrite`
 
	if [ $? -eq 1 ]; then
		exit
	fi

The convert command is exactly the same as in the previous script.

convert $input_file $output_file

However, in this script provides the option of deleting the image file after the .pdf file has been created.

zenity --question --text="Do you want to delete the image file before you exit?"
 
	case $? in
		0) rm $input_file;;
 
		1) exit;;
	esac

The zenity –guestion dialog prints the text into a pop up window that provides two buttons, Yes and No. Zenity returns 0 if yes and 1 if no.

A case statement follows which evaluates the exit code and will either delete the file or exit the script accordingly. Case statements are handy for this type of task and are generally used instead of if statements when multiple options may be involved. Note the syntax as well as that a case statement must close with esac.


There are other GUI dialog programs. KDE has kdialog which is based on the Qt toolkit, there is also dialog, xdialog, yad/ and others (I'm sure). Their features and syntax vary but if you understand the basics of how zenity was used in this script you shouldn't have any trouble sorting out how to use one of the others. In the next section I''ll discuss a script I use on our print server to shut it down if there is nobody using the lan.


Cheers!