samedi 5 août 2017

wxPython pour réaliser des interfaces graphique sous Python

Il n'y a pas si longtemps, je suis tombé sur cet article qui à retenu toute mon attention


Pour en revenir à l'article, il propose de réaliser:
  1. Une interface graphique à l'aide de wxFormBuilder
  2. Exporter l'interface dans un fichier python (directement depuis wxFormBuilder)
  3. Créer le code (vraiment très rudimentaire) pour coder l'exemple en python
Exemple wxFormBuilder et Python

Je me suis donc lancé dans l'expérimentation en installant wxFormBuilder sur mon Linux Mint (Ubuntu).

Petite surprise
En suivant les instructions mentionnées dans l'article pour l'installation de wxFormBuilder, j'ai vite remarqué que le code Python généré par wxFormBuilder (compilé depuis GitHub) n'était pas compatible avec wxPython  (installé depuis les packages pythons avec "pip install -U wxPython").

Ce n'est pas grand chose... juste un appel de fonction à modifier dans le fichier Python généré par wxFormBuilder.
Ce n'est quand même pas très "propre", sans savoir ce que cela cache comme autre surprise.

Cause et solution
Je me doutais que la version de wxPython (des dépots Python) n'était pas en concordance avec la version wxFormBuilder disponible sur GitHub.
La solution:
  • re-compiler wxPython 
  • compiler wxFormBuilder
Recette pour recompiler wxPython et wxFormBuilder
Recompiler wxPython ne fut pas de tout repos et il n'aura fallut pas loin d'une journée pour y arriver.
Voici donc la recette magique:

# === Installer les essentiels ===
# essentiels de compilation
sudo apt-get install build-essential g++

# Installer GTK 2.0
sudo apt-get install gtk2.0

# === Install wxPython ===
# comme mentionné sur https://www.wxpython.org/pages/downloads/
# l intruction suivante ne compatible pas bien:
#
# pip install -U wxPython

# Comme indiqué dans l'article, l'instruction suivante 
# ne fournit pas une compatibilité optimale entre le code 
# Python généré par wxFormBuilder et le package Python 
#
# sudo apt-get install python-wxgtk3.0

# === Compilation de wxPython ===
# Installer GStreamer requis pour compiler wxPython
sudo apt-get install libgstreamer0.10
sudo apt-get install libgstreamer0.10-dev
sudo apt-get install libgstreamer-plugins-base0.10
sudo apt-get install libgstreamer-plugins-base0.10-dev
sudo apt-get install gir1.2-gst-plugins-base-0.10
sudo apt-get install gir1.2-gstreamer-0.10

# Installer WebKit requis pour compiler wxPython 
# NB: identifier les module WebKit avec "sudo apt-cache search libwebkit"
# NB: pas suffisant "sudo apt-get install libwebkit2gtk-3.0-dev"
sudo apt-get install libwebkitgtk-3.0-0 libwebkitgtk-dev 

# Installer python3-dev, requis pour avoir python3-config.
# python3-config utilisé par la compilation de wxPython
sudo apt-get install python3-dev

# Installer wxPython 4.0 pour python3
# La compilation peut prendre plus d'une heure
sudo pip3 install -U \
    -f https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-16.04 \
    wxPython

# === Compilation de wxFormBuilder ===
# Conformément au projet GitHub
# https://github.com/wxFormBuilder/wxFormBuilder

sudo apt-get install libwxgtk3.0-dev libwxgtk-media3.0-dev libboost-dev

cd /tmp
git clone --recursive --depth=1 https://github.com/wxFormBuilder/wxFormBuilder
cd wxFormBuilder
./create_build_files4.sh
cd build/3.0/gmake
make config=release

=== Exécuter la version compilée ===
cd ../../../output/bin/
./wxformbuilder

== Installer wxFormBuilder (Ubuntu/Mint) ==
# copy software to /usr/bin/
sudo mkdir /usr/share/wxformbuilder

# COPIER TOUS les fichiers de 
#   /tmp/wxFormBuilder/output/
# vers
#   /usr/share/wxformbuilder

# Reconstruire le lien symbolique de share/wxformbuilder 
# vers le répertoire "share" de notre installatin
sudo rm /usr/share/wxformbuilder/share/wxformbuilder
cd /usr/share/wxformbuilder/share
sudo ln -s /usr/share/wxformbuilder wxformbuilder

# Créer un lien symbolique dans /usr/bin
# pour pouvoir appeler wxformbuilder depuis la ligne 
# de commande
cd /usr/bin
ln -s /usr/share/wxformbuilder/bin/wxformbuilder wxformbuilder

Ressources