Remi est une bibliothèque GUI pour les applications Python qui est rendue dans les navigateurs Web. Cela vous permet d’accéder à votre interface localement et à distance.
Reddit - (sous-reddit RemiGUI)
Il existe également un éditeur GUI par glisser-déposer . Regardez le sous-dossier Editor pour télécharger votre copie.
Une vidéo démonstrative des grands labos REVVEN
Pour une version stable :
pip install remi
Pour la version expérimentale la plus à jour, téléchargez ou consultez Remi depuis git et installez
python setup.py install
ou installez directement en utilisant pip
pip install git+https://github.com/rawpython/remi.git
Ensuite, démarrez le script de test (téléchargez-le depuis github https://github.com/rawpython/remi/blob/master/examples/widgets_overview_app.py) :
python widgets_overview_app.py
Bibliothèque GUI Python indépendante de la plate-forme. En moins de 100 Ko de code source, parfait pour votre alimentation.
Remi permet aux développeurs de créer une interface graphique indépendante de la plate-forme avec Python. L'intégralité de l'interface graphique est rendue dans votre navigateur. Aucun HTML n'est requis, Remi traduit automatiquement votre code Python en HTML. Lorsque votre application démarre, elle démarre un serveur Web qui sera accessible sur votre réseau.
Une application de base apparaît comme ceci :
import remi . gui as gui
from remi import start , App
class MyApp ( App ):
def __init__ ( self , * args ):
super ( MyApp , self ). __init__ ( * args )
def main ( self ):
container = gui . VBox ( width = 120 , height = 100 )
self . lbl = gui . Label ( 'Hello world!' )
self . bt = gui . Button ( 'Press me!' )
# setting the listener for the onclick event of the button
self . bt . onclick . do ( self . on_button_pressed )
# appending a widget to another, the first argument is a string key
container . append ( self . lbl )
container . append ( self . bt )
# returning the root widget
return container
# listener function
def on_button_pressed ( self , widget ):
self . lbl . set_text ( 'Button pressed!' )
self . bt . set_text ( 'Hi!' )
# starts the web server
start ( MyApp , port = 8081 )
Pour voir l'interface utilisateur, ouvrez votre navigateur préféré et tapez « http://127.0.0.1:8081 ». Vous pouvez modifier l'adresse URL par des **kwargs spécifiques au start
de l'appel de fonction. Ceci sera discuté plus tard.
Testé sur Android, Linux, Windows. Utile sur Raspberry Pi pour le développement de scripts Python. Il permet d'interagir avec votre Raspberry Pi à distance depuis votre appareil mobile.
Pourquoi une autre bibliothèque GUI ? Kivy, PyQT et PyGObject nécessitent tous du code natif pour le système d'exploitation hôte, ce qui nécessite l'installation ou la compilation de dépendances volumineuses. Remi n'a besoin que d'un navigateur Web pour afficher votre interface graphique.
Dois-je connaître le HTML ? NON, ce n'est pas obligatoire, vous devez coder uniquement en Python.
Est-ce open source ? À coup sûr! Remi est publié sous licence Apache. Voir le fichier LICENSE
pour plus de détails.
Ai-je besoin d’une sorte de serveur Web ? Non, c'est inclus.
Importez la bibliothèque Remi et quelques autres éléments utiles.
import remi . gui as gui
from remi import start , App
Sous-classez la classe App
et déclarez une fonction main
qui sera le point d'entrée de l'application. Dans la fonction principale, vous devez return
le widget racine.
class MyApp ( App ):
def __init__ ( self , * args ):
super ( MyApp , self ). __init__ ( * args )
def main ( self ):
lbl = gui . Label ( "Hello world!" , width = 100 , height = 30 )
# return of the root widget
return lbl
En dehors de la classe principale, démarrez l'application en appelant la fonction start
et en passant le nom de la classe que vous avez déclarée précédemment en paramètre :
# starts the webserver
start ( MyApp , port = 8081 )
Exécutez le script. Si tout va bien, l'interface graphique s'ouvrira automatiquement dans votre navigateur, sinon vous devrez taper dans la barre d'adresse "http://127.0.0.1:8081".
Vous pouvez personnaliser les paramètres facultatifs dans l'appel start
comme :
start ( MyApp , address = '127.0.0.1' , port = 8081 , multiple_instance = False , enable_file_cache = True , update_interval = 0.1 , start_browser = True )
Paramètres :
Paramètres supplémentaires :
Tous les constructeurs de widgets acceptent deux standards**kwargs qui sont :
Les widgets exposent un ensemble d'événements qui se produisent lors de l'interaction de l'utilisateur. De tels événements constituent un moyen pratique de définir le comportement de l'application. Chaque widget possède ses propres rappels, en fonction du type d'interaction utilisateur qu'il autorise. Les rappels spécifiques aux widgets seront illustrés plus tard.
Afin d'enregistrer une fonction en tant qu'écouteur d'événement, vous devez appeler une fonction comme eventname.do (c'est-à-dire onclick.do) en passant en paramètre le rappel qui gérera l'événement. Suit un exemple :
import remi . gui as gui
from remi import start , App
class MyApp ( App ):
def __init__ ( self , * args ):
super ( MyApp , self ). __init__ ( * args )
def main ( self ):
container = gui . VBox ( width = 120 , height = 100 )
self . lbl = gui . Label ( 'Hello world!' )
self . bt = gui . Button ( 'Press me!' )
# setting the listener for the onclick event of the button
self . bt . onclick . do ( self . on_button_pressed )
# appending a widget to another, the first argument is a string key
container . append ( self . lbl )
container . append ( self . bt )
# returning the root widget
return container
# listener function
def on_button_pressed ( self , widget ):
self . lbl . set_text ( 'Button pressed!' )
self . bt . set_text ( 'Hi!' )
# starts the web server
start ( MyApp )
Dans l'exemple présenté, self.bt.onclick.do(self.on_button_pressed) enregistre la fonction on_button_pressed de self en tant qu'écouteur pour l'événement onclick exposé par le widget Button. Simple, facile.
Les rappels de l'auditeur recevront d'abord l'instance de l'émetteur, puis tous les autres paramètres fournis par l'événement spécifique.
Outre l'enregistrement d'événement standard (comme mentionné ci-dessus), il est possible de transmettre des paramètres utilisateur aux fonctions d'écoute. Cela peut être réalisé en ajoutant des paramètres à l’appel de fonction do .
import remi . gui as gui
from remi import start , App
class MyApp ( App ):
def __init__ ( self , * args ):
super ( MyApp , self ). __init__ ( * args )
def main ( self ):
container = gui . VBox ( width = 120 , height = 100 )
self . lbl = gui . Label ( 'Hello world!' )
self . bt = gui . Button ( 'Hello name!' )
self . bt2 = gui . Button ( 'Hello name surname!' )
# setting the listener for the onclick event of the buttons
self . bt . onclick . do ( self . on_button_pressed , "Name" )
self . bt2 . onclick . do ( self . on_button_pressed , "Name" , "Surname" )
# appending a widget to another
container . append ( self . lbl )
container . append ( self . bt )
container . append ( self . bt2 )
# returning the root widget
return container
# listener function
def on_button_pressed ( self , widget , name = '' , surname = '' ):
self . lbl . set_text ( 'Button pressed!' )
widget . set_text ( 'Hello ' + name + ' ' + surname )
# starts the web server
start ( MyApp )
Cela permet une grande flexibilité, permettant d'obtenir des comportements différents avec la même définition d'écouteur d'événement.
Parfois, il est nécessaire d'accéder à la représentation HTML du Widget afin de manipuler les attributs HTML. La bibliothèque permet d'accéder facilement à ces informations.
Un exemple simple : C'est le cas où vous souhaiteriez ajouter un texte de survol à un widget. Ceci peut être réalisé par l'attribut title d'une balise HTML. Pour ce faire :
widget_instance . attributes [ 'title' ] = 'Your title content'
Un cas particulier d'attribut HTML est le style . Les attributs de style peuvent être modifiés de la manière suivante :
widget_instance . style [ 'color' ] = 'red'
L'affectation d'un nouvel attribut le crée automatiquement.
Pour une liste de référence des attributs HTML, vous pouvez vous référer à https://www.w3schools.com/tags/ref_attributes.asp
Pour une liste de référence des attributs de style, vous pouvez vous référer à https://www.w3schools.com/cssref/default.asp
Faites attention aux attributs utilisés en interne. Ce sont :
Si vous utilisez votre application REMI à distance, avec un DNS et derrière un pare-feu, vous pouvez spécifier des paramètres spéciaux lors de l'appel start
:
start ( MyApp , address = '0.0.0.0' , port = 8081 )
Je suggère d'utiliser le navigateur comme fenêtre d'interface standard.
Cependant, vous pouvez éviter d'utiliser le navigateur. Cela peut être simplement obtenu en rejoignant REMI et PyWebView. Voici un exemple de ce standalone_app.py.
Sachez que PyWebView utilise qt, gtk, etc. pour créer la fenêtre. Une version obsolète de ces bibliothèques peut entraîner des problèmes d'interface utilisateur. Si vous rencontrez des problèmes d'interface utilisateur, mettez à jour ces bibliothèques ou évitez mieux l'exécution autonome.
Afin de limiter l'accès à distance à votre interface, vous pouvez définir un identifiant et un mot de passe. Il s’agit d’un simple processus d’authentification. Définissez simplement les paramètres nom d'utilisateur et mot de passe dans l'appel de démarrage :
start ( MyApp , username = 'myusername' , password = 'mypassword' )
Afin de définir un nouveau style pour votre application, vous devez procéder comme suit. Créez un dossier res et transmettez-le à votre constructeur de classe App :
class MyApp ( App ):
def __init__ ( self , * args ):
res_path = os . path . join ( os . path . dirname ( __file__ ), 'res' )
super ( MyApp , self ). __init__ ( * args , static_file_path = { 'res' : res_path })
Copiez le fichier style.css standard du dossier remi et collez-le dans votre dossier res . Modifiez-le afin de le personnaliser. De cette façon, le fichier style.css standard est remplacé par celui que vous avez créé.
Remi est conçu pour être compatible de Python2.7 à Python3.X. Veuillez signaler les problèmes de compatibilité.
Remi doit être conçu comme un framework GUI de bureau standard. La bibliothèque elle-même ne met pas en œuvre de stratégies de sécurité et il est donc conseillé de ne pas exposer son accès à des réseaux publics non sécurisés.
Lors du chargement de données provenant de sources externes, pensez à protéger l'application contre une éventuelle injection de javascript avant d'afficher directement le contenu.
PySimpleGUI : lancé en 2018, activement développé et pris en charge. Prend en charge tkinter, Qt, WxPython, Remi (dans le navigateur). Créez simplement des interfaces graphiques de mise en page personnalisées. Prise en charge de Python 2.7 et 3. Plus de 100 programmes de démonstration et livre de recettes pour un démarrage rapide. Documentation complète.
Modèle d'application pour REMI : un modèle très bien écrit pour les applications multi-vues.
Reconfiguration dynamique basée sur le Web pour les robots ROS
razmq
Espresso-ARM
PiPrésente
Le framework Python Banyan
Responsable du spectacle LightShowPi
rElectrum : Un puissant gestionnaire de portefeuille Electrum prometteur pour des transactions sécurisées.
Voici d'autres implémentations de cette bibliothèque :