Remi ist eine GUI-Bibliothek für Python-Anwendungen, die in Webbrowsern gerendert wird. Dadurch können Sie lokal und remote auf Ihre Schnittstelle zugreifen.
Reddit – (subreddit RemiGUI)
Es gibt auch einen Drag-and-Drop-GUI-Editor . Sehen Sie sich den Unterordner „Editor“ an, um Ihre Kopie herunterzuladen.
Ein anschauliches Video aus den großartigen REVVEN-Laboren
Für eine stabile Version:
pip install remi
Für die aktuellste experimentelle Version laden Sie Remi von Git herunter oder schauen Sie es sich an und installieren Sie es
python setup.py install
oder direkt mit pip installieren
pip install git+https://github.com/rawpython/remi.git
Starten Sie dann das Testskript (laden Sie es von Github https://github.com/rawpython/remi/blob/master/examples/widgets_overview_app.py herunter):
python widgets_overview_app.py
Plattformunabhängige Python-GUI-Bibliothek. In weniger als 100 KByte Quellcode, perfekt für Ihre Ernährung.
Remi ermöglicht Entwicklern die Erstellung einer plattformunabhängigen GUI mit Python. Die gesamte GUI wird in Ihrem Browser gerendert. Es ist kein HTML erforderlich, Remi übersetzt Ihren Python-Code automatisch in HTML. Wenn Ihre App startet, startet sie einen Webserver, auf den in Ihrem Netzwerk zugegriffen werden kann.
Eine einfache Anwendung sieht folgendermaßen aus:
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 )
Um die Benutzeroberfläche anzuzeigen, öffnen Sie Ihren bevorzugten Browser und geben Sie „http://127.0.0.1:8081“ ein. Sie können die URL-Adresse durch bestimmte **kwargs beim start
ändern. Dies wird später besprochen.
Getestet auf Android, Linux, Windows. Nützlich auf Raspberry Pi für die Python-Skriptentwicklung. Es ermöglicht die Ferninteraktion mit Ihrem Raspberry Pi von Ihrem Mobilgerät aus.
Warum eine andere GUI-Bibliothek? Kivy, PyQT und PyGObject erfordern alle nativen Code für das Host-Betriebssystem, was die Installation oder Kompilierung großer Abhängigkeiten bedeutet. Remi benötigt nur einen Webbrowser, um Ihre GUI anzuzeigen.
Muss ich HTML beherrschen? NEIN, es ist nicht erforderlich, Sie müssen nur in Python programmieren.
Ist es Open Source? Sicher! Remi wird unter der Apache-Lizenz veröffentlicht. Weitere Einzelheiten finden Sie in der LICENSE
-Datei.
Benötige ich eine Art Webserver? Nein, es ist im Lieferumfang enthalten.
Importieren Sie die Remi-Bibliothek und einige andere nützliche Dinge.
import remi . gui as gui
from remi import start , App
Erstellen Sie eine Unterklasse der App
Klasse und deklarieren Sie eine main
, die den Einstiegspunkt der Anwendung darstellt. Innerhalb der Hauptfunktion müssen Sie das Root-Widget return
.
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
Außerhalb der Hauptklasse starten Sie die Anwendung, indem Sie die Funktion start
aufrufen und den Namen der zuvor deklarierten Klasse als Parameter übergeben:
# starts the webserver
start ( MyApp , port = 8081 )
Führen Sie das Skript aus. Wenn alles in Ordnung ist, wird die GUI automatisch in Ihrem Browser geöffnet. Andernfalls müssen Sie in die Adresszeile „http://127.0.0.1:8081“ eingeben.
Sie können optionale Parameter im start
anpassen, wie zum Beispiel:
start ( MyApp , address = '127.0.0.1' , port = 8081 , multiple_instance = False , enable_file_cache = True , update_interval = 0.1 , start_browser = True )
Parameter:
Zusätzliche Parameter:
Alle Widget-Konstruktoren akzeptieren zwei Standards**:
Widgets stellen eine Reihe von Ereignissen bereit, die während der Benutzerinteraktion auftreten. Solche Ereignisse sind eine praktische Möglichkeit, das Anwendungsverhalten zu definieren. Jedes Widget verfügt über eigene Rückrufe, abhängig von der Art der Benutzerinteraktion, die es zulässt. Die spezifischen Rückrufe für die Widgets werden später erläutert.
Um eine Funktion als Ereignis-Listener zu registrieren, müssen Sie eine Funktion wie eventname.do (z. B. onclick.do) aufrufen und als Parameter den Rückruf übergeben, der das Ereignis verwaltet. Es folgt ein Beispiel:
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 )
Im gezeigten Beispiel registriert self.bt.onclick.do(self.on_button_pressed) die on_button_pressed -Funktion des Selbst als Listener für das vom Button-Widget bereitgestellte Ereignis onclick . Einfach, leicht.
Die Rückrufe des Listeners empfangen zuerst die Instanz des Emitters und dann alle anderen Parameter, die vom jeweiligen Ereignis bereitgestellt werden.
Neben der Standard-Ereignisregistrierung (wie oben erwähnt) ist es möglich, Benutzerparameter an Listener-Funktionen zu übergeben. Dies kann durch Anhängen von Parametern an den do -Funktionsaufruf erreicht werden.
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 )
Dies ermöglicht große Flexibilität und ermöglicht unterschiedliche Verhaltensweisen mit derselben Ereignis-Listener-Definition.
Manchmal ist es erforderlich, auf die HTML-Darstellung des Widgets zuzugreifen, um HTML-Attribute zu manipulieren. Die Bibliothek ermöglicht den einfachen Zugriff auf diese Informationen.
Ein einfaches Beispiel: Es ist der Fall, dass Sie einem Widget einen Hover-Text hinzufügen möchten. Dies kann durch das Title -Attribut eines HTML-Tags erreicht werden. Um dies zu tun:
widget_instance . attributes [ 'title' ] = 'Your title content'
Ein Sonderfall des HTML-Attributs ist der Stil . Die Stilattribute können auf diese Weise geändert werden:
widget_instance . style [ 'color' ] = 'red'
Durch die Zuweisung eines neuen Attributs wird dieses automatisch erstellt.
Eine Referenzliste der HTML-Attribute finden Sie unter https://www.w3schools.com/tags/ref_attributes.asp
Eine Referenzliste der Stilattribute finden Sie unter https://www.w3schools.com/cssref/default.asp
Achten Sie auf intern verwendete Attribute. Diese sind:
Wenn Sie Ihre REMI-App remote, mit einem DNS und hinter einer Firewall nutzen, können Sie im start
spezielle Parameter festlegen:
start ( MyApp , address = '0.0.0.0' , port = 8081 )
Ich schlage vor, den Browser als Standardschnittstellenfenster zu verwenden.
Sie können jedoch auf die Verwendung des Browsers verzichten. Dies kann einfach durch die Verknüpfung von REMI und PyWebView erreicht werden. Hier ist ein Beispiel für diese standalone_app.py.
Beachten Sie, dass PyWebView zum Erstellen des Fensters qt, gtk usw. verwendet. Eine veraltete Version dieser Bibliotheken kann zu Problemen mit der Benutzeroberfläche führen. Wenn Probleme mit der Benutzeroberfläche auftreten, aktualisieren Sie diese Bibliotheken oder vermeiden Sie besser die eigenständige Ausführung.
Um den Fernzugriff auf Ihre Schnittstelle einzuschränken, können Sie einen Benutzernamen und ein Passwort festlegen. Es besteht aus einem einfachen Authentifizierungsprozess. Definieren Sie einfach im Startaufruf die Parameter Benutzername und Passwort :
start ( MyApp , username = 'myusername' , password = 'mypassword' )
Um einen neuen Stil für Ihre App zu definieren, müssen Sie Folgendes tun. Erstellen Sie einen res- Ordner und übergeben Sie ihn an Ihren App-Klassenkonstruktor:
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 })
Kopieren Sie die Standarddatei style.css aus dem remi-Ordner und fügen Sie sie in Ihren res -Ordner ein. Bearbeiten Sie es, um es anzupassen. Auf diese Weise wird die Standarddatei „style.css“ durch die von Ihnen erstellte Datei überschrieben.
Remi ist so konzipiert, dass es von Python2.7 bis Python3.X kompatibel ist. Bitte melden Sie Kompatibilitätsprobleme.
Remi sollte als Standard-Desktop-GUI-Framework gedacht sein. Da die Bibliothek selbst keine Sicherheitsstrategien implementiert, wird empfohlen, ihren Zugriff nicht unsicheren öffentlichen Netzwerken auszusetzen.
Wenn Sie Daten aus externen Quellen laden, sollten Sie erwägen, die Anwendung vor einer möglichen Javascript-Injektion zu schützen, bevor Sie den Inhalt direkt anzeigen.
PySimpleGUI: 2018 eingeführt. Aktiv entwickelt und unterstützt. Unterstützt tkinter, Qt, WxPython, Remi (im Browser). Erstellen Sie ganz einfach benutzerdefinierte Layout-GUIs. Unterstützung für Python 2.7 und 3. Über 100 Demoprogramme und Kochbuch für einen schnellen Einstieg. Umfangreiche Dokumentation.
App-Vorlage für REMI: Eine wirklich gut geschriebene Vorlage für Multiview-Anwendungen.
Webbasierte dynamische Neukonfiguration für ROS-Roboter
razmq
Espresso-ARM
PiPresents
Das Python Banyan Framework
LightShowPi-Showmanager
rElectrum: Ein leistungsstarker, vielversprechender Electrum-Wallet-Manager für sichere Transaktionen.
Hier sind weitere Implementierungen dieser Bibliothek aufgeführt: