GUI erstellen mit GTKDialog
von musonio
Letzten Monat hat Leiche ein Bash/Zenity Skript vorgestellt (nun in den Paketquellen enthalten) basierend auf einer GUI, das mehrere nützliche Befehle und Anwendungen für die Kommandozeile enthält. Ich hatte einige Stunden Zeit und spielte ein bisschen mit dem Ausfüllen des Skriptes mit GTKDIALOG herum, das Resultat sieht folgendermaßen aus:
GTKDIALOG ähnelt ZENITY oder KDIALOG, ist aber extrem anpassungsfähig und ermöglicht es, die verschiedenen Widgets (Buttons, Labels, Menüs, Listen, etc.) in unendlichen Kombinationen zu gestalten.
Wie ich das Skript verwendet habe ist absolut grundlegend. Ich habe es nur verwendet um das Bash-Skript auszufüllen, ohne weitere Funktionen als die Schaltflächen zu drücken. Da die Möglichkeiten endlos sind, werde ich nur die Alternativen, die tatsächlich in dem Skript verwendet wurden kommentieren. (Weiterführende Links finden Sie unten).
Das Skript soll einen bequemen Zugriff auf Systemdateien bieten, für die ich normalerweise ein Kommandozeilenprogramm zum Lesen/Bearbeiten benötige und ich zu faul bin sie ins Terminal einzugeben. Nachdem ich Befehle von Leiche und ein paar weitere Anwendung die ich persönlich für nützlich halte ausgewählt hatte ist das Ergebnis vom persönlichen Geschmack abhängig.
Die Frage ist eben, entspricht das Erstellte den Anforderungen von jemanden. Es ist meist eine Frage vom Ausprobieren, genauso wie eine Frage der Ordnungsliebe. Ich denke, der Schlüssel liegt für Anfänger wie mich darin, die korrekte Anordnung der Registerkarten (oder Markierungen), die es ermöglicht, klar zu sehen, wo ein Abschnitt beginnt und endet, sowie zu prüfen ob noch irgendwelche Tags offen sind.
Buttons, Rahmen und Menüs können nach ihrem Geschmack angeordnet werden. Das Einzige was Sie verstehen müssen ist, wie die Handlungsfelder zu definieren sind.
Um es an einem Beispiel zu verdeutlichen, werfen wir einen Blick auf den unteren Teil des GUI:
Struktur: Ein Rahmen (die äußere Linie; ohne Label), dieser enthält ein horizontales Feld, welches drei Elemente (Button, Text, Button) enthält.
Demzufolge:
<frame> <hbox> <button></button> <text></text> <button></button> </hbox> </frame>
Die Struktur: Ein Rahmen (die äußere Linie) mit einem Label (Befehlinformation), dass zwei horizontale Felder (das erste von ihnen enthält ein TEXT und ein EINGABE Feld, das zweite enthält 6 Schaltflächen).
Demzufolge:
<frame Label> <hbox> <text><label></label></text> <entry><variable></variable></entry> </hbox> <hbox> <button></button> (x6) </hbox> </frame>
GTKDIALOGS
Gtk-Dialoge sind wie Funktionen: sie müssen erstellt werden, bevor Sie ausgeführt werden können.
Das ist der Grund, wieso in unserem Script, folgender Eintrag steht:
export MAIN_DIALOG=' <window> <vbox> ................. </vbox> </window> ' gtkdialog --program=MAIN_DIALOG
Es liegt nur an diese Zeile, die tatsächlich den Dialog ausführt. Wenn diese Zeile nicht vorhanden wäre, würde das Skript absolut nichts tun.
TAGS
GtkDialog ist, laut der Homepage des Projekts, "ein kleines Programm zum schnellen und einfachen Erstellen von grafischen Benutzeroberflächen. Es kann verwendet werden, um Dialogfelder von nahezu jedem interpretierten und aufbereiteten Programm zu erstellen, was eine sehr attraktive Funktion ist, da die Entwickler nicht erst die verschiedenen Sprachen bzw. Programmiersprachen für ein GUI erlernen müssen".
GTKdialogs ist in einer XML-ähnlichen Sprache geschrieben: Jedes Widget ist in Tags eingefügt, die ein abschließendes Paar benötigen. Wenn dieses nicht gefunden wird oder wenn es nicht richtig platziert ist, kann das Skript nicht ausgeführt werden.
Tags sind wie im folgenden Beispiel verschachtelt:
<window> <vbox> <button> <label>Kate</label> <action>kate</action> </button> </vbox> </window>
(In der Tat, sind die Fenster und die vbox-Tags in diesem Beispiel inaktiv, da sie nur ein Element enthalten.)
Die eigentliche Handlung steckt in unserem Script und zwar nur im Bereich der Buttons; hboxes, vboxes, frames und menus stellen nur die Behälter für diese Buttons zur Verfügung. Wie legen wir fest, was passieren soll, wenn wir auf ein Symbol klicken? Wir schreiben einfach den Befehl den wir ausführen möchten zwischen die ACTION-Tags. Da dies ein Bash-Skript ist, benutzen wir einfach die Befehle, die wir in einem Bash-Skript verwenden würden mit ein paar leichten Veränderungen, die später erklärt werden.
Die wichtigsten Widgets die wir im Skript verwenden, sind folgende:
WINDOW (Fenster)
Das Fenster Tag, welches nicht immer benötigt wird, ermöglicht Ihnen einige umfassende Attribute festzulegen, wie z.B.: die Größe des Fensters, ob die Größe geändert werden kann oder nicht, ob es vor der Anwendungsleiste erscheinen soll, in die Taskleiste setzen, usw.
Einige nützliche Optionen:
window_position="x" width_request="x" height_request="x" title="_" (Standard ist "gtk-dialog") maximize_initially="true" (Standard ist false) skip_taskbar_hint="true" (Standard ist false)
VBOX und HBOX
Die vbox (vertikales Feld)und die hbox (horizontales Feld) enthalten die Tasten, Menüs, Texte, Listen, usw. oder auch andere vertikale Felder (vboxes) und horizontale Felder (hboxes), wie wir in unserem Beispiel sehen werden.
HBoxes lässt zwei Haupteigenschaften zu:
- homogeneous="true"
- Heißt, wenn die anderen Widgets innerhalb des Feldes gleichmäßig verteilt sind (Standard ist „no“ dies ordnet alle Widgets auf der rechten Seite des horizontalen Felds an).
- spacing="x"
- Gibt den Abstand zwischen Symbolen an.
Beide Optionen müssen innerhalb der ersten Tags angegeben werden:
<hbox homogeneous="true"> </hbox>
oder:
<hbox spacing="20"> </hbox>
oder:
<hbox homogeneous="true" spacing="20"> </hbox>
FRAMES (Rahmen)
Frames sind nützlich um mehrere Widgets zusammenzufassen. Das Label muss sich innerhalb des ersten Tags befinden. Wenn kein Label angegeben ist, wird eine einfache Linie gezeichnet.
MENUS (Menüs)
Die einfachste Form eines Menü hat die folgende Struktur:
<menubar> <menu> <menuitem> <label></label> <action></action> </menuitem> <label></label> </menu> </menubar>
Es ist offensichtlich, als Menüpunkte können Sie einfügen was Sie möchten, sofern Sie diese richtig anlegen.
Wie in dem Skript, können Sie auch ein Menü durch erstellen eines horizontalen Felds gestalten, welches beides enthält, die Darstellung und das Menü:
<hbox> <pixmap> <input file>path_to_file</input> </pixmap> <menubar> <menu> <menuitem> <label></label> <action></action> </menuitem> <label></label> </menu> </menubar> </hbox>
Entry (Eintrag)
Einträge sind Felder, die dem Benutzer die Möglichkeit bieten etwas einzugeben.
Im Fall der Kernel Meldung und Befehlinformation wird der Wert der Eingabe in einer Variablen angegeben, die anschließend "verarbeitet" wird, wenn die Taste gedrückt wird, welche wir definiert haben.
BUTTON (Tasten)
Es gibt zwei Haupttypen von Tasten:
- Vordefinierte Tasten
- 1. Benutzerdefinierte Tasten:Tasten mit Text und Darstellungen, Tasten nur mit Text, Tasten nur mit Darstellungen
Vordefinierte Tasten:
- <button help></button>
- <button yes></button>
- <button no></button>
- <button ok></button>
- <button cancel></button>
(siehe Gtkdialog Beispiele für vordefinierte Tasten in Bild und Text).
- Benutzerdefinierte Tasten nur mit Text
<button> <label>Kate editor</label> <action>kate</action> </button>
- Benutzerdefinierte Tasten nur mit Darstellungen
<button> <input file>/usr/share/pixmaps/VBox.png</input> <action>kate</action> </button>
- Benutzerdefinierte Tasten mit Text und Darstellungen
<button> <input file>/usr/share/pixmaps/VBox.png</input> <label>Virtual Box</label> <action>kate</action> </button>
Vorher erwähnte ich, dass es sich um ein sehr grundlegendes Beispiel von GTKDialog handelt. Andere interessante Alternativen sind Aufzeichnungen, Radiolisten, vollständig anpassbare Text Dialoge u.s.w. (Besuchen Sie die Links weiter unten für weitere Anweisungen wie diese zu verwenden sind).
Ein paar Informationen über die Syntax
- Da die Syntax und Struktur der Bash-Skripte in den vorangegangenen Ausgaben beschrieben wurde (bezogen auf die grundlegenden Elemente) und ausgezeichnete Anleitungen über Bash-Skripte im Internet zu finden sind, werde ich nur auf ein paar Dinge über das Skript zu sprechen kommen.
- Wie Sie sehen können, haben wir eine Reihe von Variablen am Anfang des Skripts definiert. Dies hat zwei Vorteile: 1.) es erlaubt uns, nur den Name der Variablen innerhalb von gtkdialog zu schreiben und wir benötigt nicht die Angabe des ganzen Pfads. 2.) Wenn wir die Datei ändern wollen, die wir über die grafische Benutzeroberfläche angezeigt bekommen, so ändern wir nur die Definition der Variablen.
-
Ein äußerst wichtiges Detail bei GTKDialog ist, dass erweiterte
Variablen manchmal geschützt werden müssen, abhängig vom Befehlsstring
gefolgt von einfachen Anführungszeichen, andernfalls werden sie nicht als
solche erkannt.
Zum Beispiel würde es in einem regulären Bash-Skript wie folgt aussehen:
VAR1=~/.kde/share VAR2="Ich bin kein großer Fan von PCLinuxOS. Ich kann nur nicht ohne es leben!" echo $VAR1 echo "$VAR2"
Innerhalb des GTKDialog verwandelt es sich in:
echo '$VAR1' echo '"$VAR2"'
- Ein paar Zeilen aus dem Skript sind zu berücksichtigen:
kdesu "dmidecode | head -15 | zenity --text-info --width=700 --height=500 --title \"BIOS information\""
Drei Dinge müssen in dieser Zeile bedacht werden:
- Die Zeichenfolge der Befehle als root auszuführen (d.h. nach kdesu), diese müssen gruppiert werden oder durch doppelte Anführungszeichen geschützt sein.
- Es ist eine doppelte Ausgabe: dmidecode erzeugt eine Ausgabe, die zu head weiter geleitet wird. Was ist die Aufgabe von head ? Es gibt nur die ersten Zeilen von der Eingabe aus (in diesem Fall die ersten 15 Zeilen). Diese letzte Ausgabe wird dann an das Zenity Fenster übergeben.
- Die doppelten Anführungszeichen innerhalb der Zeichenfolge, die wir an kdesu weitergeben müssen sind vorangestellte Backslash, was bei anderen Befehlen die wir verwendet haben nicht der Fall ist, wie bei den zenity Test-Info Dialogen.
KeyRPM=(`zenity --entry --text "Enter search word:"`) ; rpm -qa | grep "$KeyRPM" | zenity --text-info --width=900 --height=600 --title $""$KeyRPM" in installed RPMS" &
- Die Variable wird innerhalb des Aktions-Tags selbst definiert und wird in der gleichen Zeile weitergeführt ( verbunden durch ein Semikolon)
- grep "filtert" die Ausgabe von rpm-qa auf die Eingabe des Wert der Variablen.
- Das letzte "&" gibt an, dass der Prozess im Hintergrund ausgeführt wird. Dadurch können Sie weiterhin mit dem Haupt Fenster arbeiten, selbst wenn Sie das Fenster nicht geschlossen haben, das durch die Befehle geöffnet wurde die dem Symbol vorausgingen.
Extra Tipps
-
Eine beliebige Anzahl von Befehlen lassen sich durch { }
zusammenfassen, bevor diese ihre Ausgabe an einen Zenity Text Dialog
ausgeben.
Zum Beispiel der Abschnitt mit der Befehlinformation (Commands Information), der folgendermaßen aussieht:
kann wie folgt geändert werden:
Die "Hilfe ..." Schaltfläche fasst die restlichen Befehle zusammen (außer dem Handbuch):
<action>{ echo "WHATIS" && whatis $VAR1 && echo "WHEREIS" && whereis $VAR1 && echo "WHICH" && which $VAR1 && echo "VERSION" && $VAR1 --version && echo "HELP" && $VAR1 --help ; } | zenity --text-info --width=600 --height=600 --title $"Help..." &</action>
-
Sie können das Hauptfenster in ein Notizbuch ändern, mit so vielen Labeln
wie Sie wollen:
Alles was Sie dafür tun müssen, ist das Notizbuch in der ersten Zeile in GTKDialog zu definieren und eine VBox für jedes Label erstellen:
<notebook labels="System|System Files|Notebook"> <vbox></vbox> <vbox></vbox> <vbox></vbox> </notebook>
Weiterführende Links
- http://linux.pte.hu/~pipas/gtkdialog/
(Offizielle Homepage) - http://library.gnome.org/devel/gtk/unstable/GtkDialog.html
- http://www.pygtk.org/docs/pygtk/
- http://xpt.sourceforge.net/techdocs/language/gtkdialog/gtkde02-GtkdialogExamples/single/
(Bietet eine lange Liste von Beispielen mit Bilder, was man mit GTKDialog alles generieren kann) - http://forum.goblinx.com.br/viewtopic.php?p=3418#3418
- http://hizoka.funcenter.fr/linux/gtkdialog.pdf
(Gute Anleitung in Französich)
Mein Script
#! /bin/bash Encoding=UTF-8 FILE1=/etc/X11/xorg.conf FILE2=/etc/fstab FILE3=/boot/grub/menu.lst FILE4=/etc/apt/sources.list FILE5=/etc/conky/conky.conf FILE6=/etc/rc.local FILE7=/etc/sudoers FILE8=~/.bashrc FILE9=/root/.bashrc export MAIN_DIALOG=' <window window_position="1" title="System Tools"> <vbox> <hbox homogeneous="True"> <frame> <hbox homogeneous="True"> <hbox> <button> <input file>'$HOME'/.kde/share/icons/ananke/konsole_60.png</input> <action>konsole &</action> </button> </hbox> <vbox homogeneous="True"> <button> <label>TOP</label> <action>konsole -e top &</action> </button> <button> <input file>'$HOME'/.kde/share/icons/ananke/root.png</input> <action>kdesu "konsole -e top" &</action> </button> </vbox> </hbox> </frame> <vbox> <frame Kernel messages> <button> <label>View messages</label> <action>dmesg | zenity --text-info --width=700 --height=500 --title $"View kernel messages" &</action> </button> <entry><variable>VAR2</variable></entry> <hbox> <button> <label>search</label> <input file>'$HOME'/.kde/share/icons/ananke/search.png</input> <action>dmesg | grep $VAR2 | zenity --text-info --width=700 --height=500 --title $"$VAR2 in kernel messages" &</action> </button> <button> <label>search & save</label> <input file>'$HOME'/.kde/share/icons/ananke/save.png</input> <action>dmesg | grep $VAR2 > '$HOME'/dmesg_output_$VAR2.txt &</action> <action>kate '$HOME'/dmesg_output_$VAR2.txt</action> </button> </hbox> </frame> </vbox> </hbox> <frame Commands Information> <hbox> <text> <label>Command:</label> </text> <entry><variable>VAR1</variable></entry> </hbox> <hbox> <button> <label>Help</label> <action>$VAR1 --help | zenity --text-info --width=600 --height=600 --title $"Help" &</action> </button> <button> <label>Whereis</label> <action>whereis $VAR1 | zenity --text-info --width=400 --height=20 --title $"Whereis" &</action> </button> <button> <label>Which</label> <action>which $VAR1 | zenity --text-info --width=200 --height=200 --title $"Version" &</action> </button> <button> <label>Version</label> <action>$VAR1 --version | zenity --text-info --width=200 --height=200 --title $"Version" &</action> </button> <button> <label>Manual</label> <action>man $VAR1 | zenity --text-info --width=400 --height=500 --title $"Manual" &</action> </button> <button> <label>Kate Manual</label> <action>man $VAR1 >>'$HOME'/tmp/temp_man.txt</action> <action>kate '$HOME'/tmp/temp_man.txt</action> <action>rm -f '$HOME'/tmp/temp_man.txt</action> </button> </hbox> </frame> <hbox homogeneous="True"> <frame> <vbox> <button> <input file>'$HOME'/.kde/share/icons/ananke/gkrellm.png</input> <label>Sensors</label> <action>sensors | zenity --text-info --width=700 --height=500 --title $"Sensors" &</action> </button> <button> <input file>'$HOME'/.kde/share/icons/ananke/ethernet.png</input> <label>Ethernet Interfaces</label> <action>ifconfig | zenity --text-info --width=700 --height=500 --title $"View an ethernet network interface" &</action> </button> <button> <input file>'$HOME'/.kde/share/icons/ananke/wifi.png</input> <label>Wireless Interfaces</label> <action>iwconfig | zenity --text-info --width=700 --height=500 --title $"Current wireless network interface" &</action> </button> <button> <input file>'$HOME'/.kde/share/icons/ananke/synaptic.png</input> <label>Synaptic logs</label> <action>kdesu "konqueror /root/.synaptic/log" &</action> </button> <button> <input file>'$HOME'/.kde/share/icons/ananke/hardware.png</input> <label>Hardware information </label> <action>kdesu "lshw | zenity --text-info --width=700 --height=500 --title \"View detailed information about the hardware\"" &</action> </button> <button> <input file>'$HOME'/.kde/share/icons/ananke/bios.png</input> <label>BIOS information</label> <action>kdesu "dmidecode | head -15 | zenity --text-info --width=700 --height=500 --title \"BIOS information\"" &</action> </button> <button> <input file>'$HOME'/.kde/share/icons/ananke/sys1.png</input> <label>PCI devices</label> <action>lspci | zenity --text-info --width=700 --height=500 --title $"PCI devices" &</action> </button> </vbox> </frame> <frame> <vbox> <hbox> <pixmap> <input file>'$HOME'/.kde/share/icons/ananke/kde.png</input> </pixmap> <menubar> <menu> <menuitem> <label>Running kernel</label> <action>uname -a | zenity --text-info --width=900 --height=20 --title $"Current running kernel" &</action> </menuitem> <menuitem> <label>KDE Version</label> <action>kde-config --version | grep KDE | zenity --text-info --width=60 --title $"KDE Version" &</action> </menuitem> <menuitem> <label>Show Path</label> <action>echo '$PATH' | zenity --text-info --width=900 --height=10 --title $"PATH" &</action> </menuitem> <label>System Information</label> </menu> </menubar> </hbox> <hbox> <pixmap> <input file>'$HOME'/.kde/share/icons/ananke/rpm.png</input> </pixmap> <menubar> <menu> <menuitem> <label>View Installed Applications</label> <action>rpm -qa | sort | zenity --text-info --width=900 --height=600 --title $"Installed RPMS" &</action> </menuitem> <menuitem> <label>Open list of Installed Applications</label> <action>zenity --info --text "I will open a list of the installed RPMs in a temporary text file. \\nIf you want to keep it, save it in a different location, since the temporary file will be removed."</action> <action>rpm -qa | sort >> '$HOME'/tmp/installed_rpms.txt</action> <action>kate '$HOME'/tmp/installed_rpms.txt</action> </menuitem> <menuitem> <label>Search in list of installed Applications</label> <action>KeyRPM=(`zenity --entry --text "Enter search word:"`) ; rpm -qa | grep "$KeyRPM" | zenity --text-info --width=900 --height=600 --title $""$KeyRPM" in installed RPMS" &</action> </menuitem> <label>Installed Applications</label> </menu> </menubar> </hbox> <hbox> <pixmap> <input file>'$HOME'/.kde/share/icons/ananke/devices.png</input> </pixmap> <menubar> <menu> <menuitem> <label>Hard drive partitions</label> <action>kdesu "fdisk -l | zenity --text-info --width=700 --height=500 --title $"Hard drive partitions"" &</action> </menuitem> <menuitem> <label>Hard drive UUID</label> <action>blkid | zenity --text-info --width=700 --height=500 --title $"Hard Drive UUID" &</action> </menuitem> <menuitem> <label>Current mount points</label> <action>mount | zenity --text-info --width=700 --height=500 --title $"Current mount points" & </action> </menuitem> <menuitem> <label>Available disk space</label> <action>df -h | zenity --text-info --width=700 --height=500 --title $"Available disk space" &</action> </menuitem> <menuitem> <label>Connected USB devices</label> <action>lsusb | zenity --text-info --width=700 --height=500 --title $"Connected USB devices" &</action> </menuitem> <label>Devices</label> </menu> </menubar> </hbox> <hbox> <pixmap> <input file>'$HOME'/.kde/share/icons/ananke/x.png</input> </pixmap> <menubar> <menu> <menuitem> <label>X-Server information</label> <action>xdpyinfo | zenity --text-info --width=700 --height=500 --title $"Information about the X-server" &</action> </menuitem> <menuitem> <label>GLX/OpenGL Information</label> <action>glxinfo | zenity --text-info --width=700 --height=500 --title $"Information about glx and opengl" & </action> </menuitem> <label>X-Server</label> </menu> </menubar> </hbox> <hbox> <pixmap> <input file>'$HOME'/.kde/share/icons/ananke/groups.png</input> </pixmap> <menubar> <menu> <menuitem> <label>Group memberships</label> <action>groups | zenity --text-info --width=700 --height=100 --title $"View group memberships" &</action> </menuitem> <menuitem> <label>Groups</label> <action>cat /etc/group | zenity --text-info --width=700 --height=500 --title $"View Groups" &</action> </menuitem> <label>Groups</label> </menu> </menubar> </hbox> <button> <label>Loaded modules</label> <action>lsmod | zenity --text-info --width=700 --height=500 --title $"View loaded modules" &</action> </button> <button> <label>Services</label> <action>chkconfig --list | zenity --text-info --width=900 --height=600 --title $"View Services" &</action> </button> </vbox> </frame> </hbox> <hbox> <frame System Files> <hbox> <button><label>'"$FILE1"'</label><action>zenity --title='"$FILE1"' --text-info --width 500 --height 400 --filename='"$FILE1"' &</action></button> <button><input file>'$HOME'/.kde/share/icons/ananke/root.png</input><action>kdesu "kate '"$FILE1"'" &</action></button> </hbox> <hbox> <button><label>'"$FILE2"'</label><action>zenity --title='"$FILE2"' --text-info --width 500 --height 400 --filename='"$FILE2"' &</action></button> <button><input file>'$HOME'/.kde/share/icons/ananke/root.png</input><action>kdesu "kate '"$FILE2"'" &</action></button> </hbox> <hbox> <button><label>'"$FILE3"'</label><action>zenity --title='"$FILE3"' --text-info --width 500 --height 400 --filename='"$FILE3"' &</action></button> <button><input file>'$HOME'/.kde/share/icons/ananke/root.png</input><action>kdesu "kate '"$FILE3"'" &</action></button> </hbox> <hbox> <button><label>'"$FILE4"'</label><action>zenity --title='"$FILE4"' --text-info --width 500 --height 400 --filename='"$FILE4"' &</action></button> <button><input file>'$HOME'/.kde/share/icons/ananke/root.png</input><action>kdesu "kate '"$FILE4"'" &</action></button> </hbox> </frame> <frame> <hbox> <button><label>'"$FILE5"'</label><action>zenity --title='"$FILE5"' --text-info --width 500 --height 400 --filename='"$FILE5"' &</action></button> <button><input file>'$HOME'/.kde/share/icons/ananke/root.png</input><action>kdesu "kate '"$FILE5"'" &</action></button> </hbox> <hbox> <button><label>'"$FILE6"'</label><action>zenity --title='"$FILE6"' --text-info --width 500 --height 400 --filename='"$FILE6"' &</action></button> <button><input file>'$HOME'/.kde/share/icons/ananke/root.png</input><action>kdesu "kate '"$FILE6"'" &</action></button> </hbox> <hbox> <button> <label>'"$FILE7"'</label> <action>kdesu "zenity --title='"$FILE7"' --text-info --width 500 --height 400 --filename='"$FILE7"'" &</action> </button> <button> <input file>'$HOME'/.kde/share/icons/ananke/root.png</input> <action>kdesu "kate '"$FILE7"'" &</action> </button> </hbox> <hbox> <button> <label>'"$FILE8"'</label> <action>kate '"$FILE8"' &</action> </button> <button> <input file>'$HOME'/.kde/share/icons/ananke/root.png</input> <action>kdesu "kate '"$FILE9"'" &</action> </button> </hbox> </frame> </hbox> <frame> <hbox homogeneous="True"> <button> <input file>'$HOME'/.kde/share/icons/ananke/info.png</input> <action>zenity --question --text "To be able to perform all the operations, the following apps must be installed: \\n\\ndmidecode lm_sensors lshw mesa-demos xdpyinfo \\n\\nDo you want to install them if they are not already installed?"; if [ "$?" = 0 ]; then kdesu "konsole --noclose -e apt-get install mesa-demos xdpyinfo lm_sensors dmidecode lshw"; fi</action> </button> <text use-markup="true"><label>"<span color='"'blue'"' font-family='"'purisa'"' weight='"'bold'"' size='"'large'"'><small>System Tools</small></span>"</label></text> <button> <input file>'$HOME'/.kde/share/icons/ananke/exit.png</input> <action type="exit">exit 0</action> </button> </hbox> </frame> </vbox> </window> ' gtkdialog --program=MAIN_DIALOG