<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2001/XInclude" type="guide" style="task" id="hello-world.py" xml:lang="fr">
<info>
<title type="text">Hello World (Python)</title>
<link type="guide" xref="py#tutorial" group="#first"/>
<revision version="0.1" date="2013-06-17" status="review"/>
<credit type="author copyright">
<name>Susanna Huhtanen</name>
<email its:translate="no">ihmis.suski@gmail.com</email>
<years>2012</years>
</credit>
<credit type="editor">
<name>Tiffany Antopolski</name>
<email its:translate="no">tiffany.antopolski@gmail.com</email>
</credit>
<desc>Une application basique « hello, world »</desc>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Luc Rebert,</mal:name>
<mal:email>traduc@rebert.name</mal:email>
<mal:years>2011</mal:years>
</mal:credit>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Alain Lojewski,</mal:name>
<mal:email>allomervan@gmail.com</mal:email>
<mal:years>2011-2012</mal:years>
</mal:credit>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Luc Pionchon</mal:name>
<mal:email>pionchon.luc@gmail.com</mal:email>
<mal:years>2011</mal:years>
</mal:credit>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Bruno Brouard</mal:name>
<mal:email>annoa.b@gmail.com</mal:email>
<mal:years>2011-12</mal:years>
</mal:credit>
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
<mal:name>Luis Menina</mal:name>
<mal:email>liberforce@freeside.fr</mal:email>
<mal:years>2014</mal:years>
</mal:credit>
</info>
<title>How to build, install and create a <file>tar.xz</file> of a Hello World program</title>
<media type="image" mime="image/png" style="floatend" src="media/hello-world.png"/>
<synopsis>
<p>This tutorial will demonstrate how to:</p>
<list style="numbered">
<item><p>create a small "Hello, World" application using Python and GTK+</p></item>
<item><p>make the <file>.desktop</file> file</p></item>
<item><p>how to set up the build system</p></item>
</list>
</synopsis>
<links type="section"/>
<section id="HelloWorld"><title>Create the program</title>
<links type="section"/>
<section id="imports"><title>Bibliothèques à importer</title>
<code mime="text/x-python"><![CDATA[from gi.repository import Gtk
import sys]]></code>
<p>In order for our script to work with GNOME, we need to import GNOME libraries via GObject Introspection. Here we import the language bindings and GTK+, the library which contains the graphical widgets used to make GNOME applications.</p>
</section>
<section id="mainwindow"><title>Création de la fenêtre principale de l'application</title>
<code mime="text/x-python"><![CDATA[class MyWindow(Gtk.ApplicationWindow):
# constructor for a Gtk.ApplicationWindow
def __init__(self, app):
Gtk.Window.__init__(self, title="Hello World!", application=app)
self.set_default_size(200, 100)
class MyApplication(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self)
def do_activate(self):
win = MyWindow(self)
win.show_all()
def do_startup(self):
Gtk.Application.do_startup(self)]]></code>
<p>Gtk.Application initializes GTK+. It also connects the <gui>x</gui> button that's automatically generated along with the window to the "destroy" signal.</p>
<p>We can start building our first window. We do this by creating a class called <var>MyWindow</var> and assigning it a Gtk.ApplicationWindow.</p>
<p>We give the window a property called <var>title</var>. The title can be any string you want it to be. To be on the safe side, it's best to stick to UTF-8 encoding.</p>
<p>Now we have a window which has a title and a working "close" button. Let's add the actual "Hello World" text.</p>
</section>
<section id="label"><title>Étiquette de la fenêtre</title>
<code mime="text/x-python"><![CDATA[# Add a label widget to your window
# create a label
label = Gtk.Label()
# set the text of the label
label.set_text("Hello GNOME!")
# add the label to the window
self.add(label)]]></code>
<p>A text label is one of the GTK+ widgets we can use, on account of having imported the GTK+ library. To use it, we create a variable called <var>label</var> and set the text that the label will hold. Finally, we create and run the application:</p>
<code mime="text/x-python"><![CDATA[#run the application
app = MyApplication()
exit_status = app.run(sys.argv)
sys.exit(exit_status)]]></code>
<p>Gtk.ApplicationWindow can only hold one widget at a time. To construct more elaborate programs you need to create a holder widget like Gtk.Grid inside the window, and then add all the other widgets to it.</p>
</section>
<section id="py"><title>hello-world.py</title>
<p>The complete file:</p>
<code mime="text/x-python" style="numbered">from gi.repository import Gtk
import sys
class MyWindow(Gtk.ApplicationWindow):
# constructor for a Gtk.ApplicationWindow
def __init__(self, app):
Gtk.Window.__init__(self, title="Welcome to GNOME", application=app)
self.set_default_size(200, 100)
# create a label
label = Gtk.Label()
# set the text of the label
label.set_text("Hello GNOME!")
# add the label to the window
self.add(label)
class MyApplication(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self)
def do_activate(self):
win = MyWindow(self)
win.show_all()
def do_startup(self):
Gtk.Application.do_startup(self)
app = MyApplication()
exit_status = app.run(sys.argv)
sys.exit(exit_status)
</code>
</section>
<section id="terminal"><title>Running the application from terminal</title>
<p>To run this application, first save it as hello-world.py. Then open Terminal, go to the folder where your application is stored and run:</p>
<screen><output style="prompt">$ </output><input>python hello-world.py</input></screen>
</section>
</section>
<section id="desktop.in"><title>The <file>.desktop.in</file> file</title>
<p>Running applications from the Terminal is useful at the beginning of the application making process. To have fully working <link href="https://developer.gnome.org/integration-guide/stable/mime.html.en">application integration</link> in GNOME 3 requires a desktop launcher. For this you need to create a <file>.desktop</file> file. The <file>.desktop</file> file describes the application name, the used icon and various integration bits. A deeper insight into the <file>.desktop</file> file can be found <link href="http://developer.gnome.org/desktop-entry-spec/">here</link>. The <file>.desktop.in</file> file will create the <file>.desktop</file>.</p>
<p>The example shows you the minimum requirements for a <code>.desktop.in</code> file.</p>
<code mime="text/desktop" style="numbered">[Desktop Entry]
Version=1.0
Encoding=UTF-8
Name=Hello World
Comment=Say Hello
Exec=@prefix@/bin/hello-world
Icon=application-default-icon
Terminal=false
Type=Application
StartupNotify=true
Categories=GNOME;GTK;Utility;
</code>
<p>Now let's go through some parts of the <code>.desktop.in</code> file.</p>
<terms>
<item><title>Nom</title><p>The application name.</p></item>
<item><title>Comment</title><p>A short description of the application.</p></item>
<item><title>Exec</title><p>Specifies a command to execute when you choose the application from the menu. In this example exec just tells where to find the <file>hello-world</file> file and the file takes care of the rest.</p></item>
<item><title>Terminal</title><p>Specifies whether the command in the Exec key runs in a terminal window.</p></item>
</terms>
<p>To put your application into the appropriate category, you need to add the necessary categories to the Categories line. More information on the different categories can be found in the <link href="http://standards.freedesktop.org/menu-spec/latest/apa.html">menu specification</link>.</p>
<p>In this example we use an existing icon. For a custom icon you need to have a .svg file of your icon, stored in <file>/usr/share/icons/hicolor/scalable/apps</file>. Write the name of your icon file to the .desktop.in file, on line 7. More information on icons in: <link href="https://live.gnome.org/GnomeGoals/AppIcon">Installing Icons for Themes</link> and <link href="http://freedesktop.org/wiki/Specifications/icon-theme-spec">on freedesktop.org: Specifications/icon-theme-spec</link>.</p>
</section>
<section id="autotools"><title>The build system</title>
<p>Pour que votre application fasse partie intégrante de GNOME 3, vous devez l'installer à l'aide d'autotools. Autotools construit et installe tous les fichiers nécessaires et les place à leurs emplacements corrects.</p>
<p>Auparavant, vous devez posséder les fichiers suivants :</p>
<links type="section"/>
<section id="autogen"><title>autogen.sh</title>
<code mime="application/x-shellscript" style="numbered">#!/bin/sh
set -e
test -n "$srcdir" || srcdir=`dirname "$0"`
test -n "$srcdir" || srcdir=.
olddir=`pwd`
cd "$srcdir"
# This will run autoconf, automake, etc. for us
autoreconf --force --install
cd "$olddir"
if test -z "$NOCONFIGURE"; then
"$srcdir"/configure "$@"
fi
</code>
<p>After the <file>autogen.sh</file> file is ready and saved, run:</p>
<screen><output style="prompt">$ </output><input>chmod +x autogen.sh</input></screen>
</section>
<section id="makefile"><title>Makefile.am</title>
<code mime="application/x-shellscript" style="numbered"># The actual runnable program is set to the SCRIPTS primitive.
# # Prefix bin_ tells where to copy this
bin_SCRIPTS = hello-world.py
# # List of files to be distributed
EXTRA_DIST= \
$(bin_SCRIPTS)
#
# # The desktop files
desktopdir = $(datadir)/applications
desktop_DATA = \
hello-world.desktop
</code>
</section>
<section id="configure"><title>configure.ac</title>
<code mime="application/x-shellscript" style="numbered"># This file is processed by autoconf to create a configure script
AC_INIT([Hello World], 1.0)
AM_INIT_AUTOMAKE([1.10 no-define foreign dist-xz no-dist-gzip])
AC_CONFIG_FILES([Makefile hello-world.desktop])
AC_OUTPUT
</code>
</section>
<section id="readme"><title>README</title>
<p>Information users should read first. This file can be blank.</p>
<p>When you have the <file>hello-world</file>, <file>hello-world.desktop.in</file>, <file>Makefile.am</file>, <file>configure.ac</file> and <file>autogen.sh</file> files with correct information and rights, the <file>README</file> file can include the following instructions:</p>
<code mime="text/readme" style="numbered">To build and install this program:
./autogen.sh --prefix=/home/your_username/.local
make install
-------------
Running the first line above creates the following files:
aclocal.m4
autom4te.cache
config.log
config.status
configure
hello-world.desktop
install-sh
missing
Makefile.in
Makefile
Running "make install", installs the application in /home/your_username/.local/bin
and installs the hello-world.desktop file in /home/your_username/.local/share/applications
You can now run the application by typing "Hello World" in the Overview.
----------------
To uninstall, type:
make uninstall
----------------
To create a tarball type:
make distcheck
This will create hello-world-1.0.tar.xz
</code>
</section>
<!-- TODO: How to make a custom icon with autotools -->
</section>
</page>