Remi es una biblioteca GUI para aplicaciones Python que se procesa en navegadores web. Esto le permite acceder a su interfaz de forma local y remota.
Reddit - (subreddit RemiGUI)
También hay un editor GUI de arrastrar y soltar . Mire la subcarpeta Editor para descargar su copia.
Un vídeo demostrativo de los grandes laboratorios REVVEN
Para una versión estable :
pip install remi
Para obtener la versión experimental más actualizada, descargue o consulte Remi desde git e instálelo
python setup.py install
o instalar directamente usando pip
pip install git+https://github.com/rawpython/remi.git
Luego inicie el script de prueba (descárguelo de github https://github.com/rawpython/remi/blob/master/examples/widgets_overview_app.py):
python widgets_overview_app.py
Biblioteca GUI de Python independiente de la plataforma. En menos de 100 Kbytes de código fuente, perfecto para tu dieta.
Remi permite a los desarrolladores crear una GUI independiente de la plataforma con Python. Toda la GUI se muestra en su navegador. No se requiere HTML , Remi traduce automáticamente su código Python a HTML. Cuando se inicia su aplicación, inicia un servidor web al que se podrá acceder en su red.
Una aplicación básica se ve así:
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 )
Para ver la interfaz de usuario, abra su navegador preferido y escriba "http://127.0.0.1:8081". Puede cambiar la dirección URL mediante **kwargs específicos al start
la llamada a la función. Esto se discutirá más adelante.
Probado en Android, Linux, Windows. Útil en Raspberry Pi para el desarrollo de scripts en Python. Permite interactuar con tu Raspberry Pi de forma remota desde tu dispositivo móvil.
¿Por qué otra biblioteca GUI? Kivy, PyQT y PyGObject requieren código nativo para el sistema operativo host, lo que significa instalar o compilar grandes dependencias. Remi sólo necesita un navegador web para mostrar su GUI.
¿Necesito saber HTML? NO, no es obligatorio, solo debes codificar en Python.
¿Es de código abierto? ¡Con seguridad! Remi se publica bajo la licencia Apache. Consulte el archivo LICENSE
para obtener más detalles.
¿Necesito algún tipo de servidor web? No, está incluido.
Importe la biblioteca Remi y algunas otras cosas útiles.
import remi . gui as gui
from remi import start , App
Subclase la clase App
y declare una función main
que será el punto de entrada de la aplicación. Dentro de la función principal tienes que return
el widget raíz.
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
Fuera de la clase principal, inicie la aplicación llamando a la función start
y pasando el nombre de la clase que declaró anteriormente como parámetro:
# starts the webserver
start ( MyApp , port = 8081 )
Ejecute el script. Si todo está bien, la GUI se abrirá automáticamente en su navegador; de lo contrario, deberá escribir en la barra de direcciones "http://127.0.0.1:8081".
Puede personalizar parámetros opcionales en la llamada start
como:
start ( MyApp , address = '127.0.0.1' , port = 8081 , multiple_instance = False , enable_file_cache = True , update_interval = 0.1 , start_browser = True )
Parámetros:
Parámetros adicionales:
Todos los constructores de widgets aceptan dos estándares**kwargs que son:
Los widgets exponen un conjunto de eventos que ocurren durante la interacción del usuario. Estos eventos son una forma cómoda de definir el comportamiento de la aplicación. Cada widget tiene sus propias devoluciones de llamada, según el tipo de interacción del usuario que permite. Las devoluciones de llamada específicas para los widgets se ilustrarán más adelante.
Para registrar una función como detector de eventos, debe llamar a una función como eventname.do (es decir, onclick.do) pasando como parámetros la devolución de llamada que gestionará el evento. Sigue un ejemplo:
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 )
En el ejemplo mostrado, self.bt.onclick.do(self.on_button_pressed) registra la función on_button_pressed del self como escucha del evento onclick expuesto por el widget de botón. Sencillo, fácil.
Las devoluciones de llamada del oyente recibirán primero la instancia del emisor y luego todos los demás parámetros proporcionados por el evento específico.
Además del registro de eventos estándar (como se mencionó anteriormente), es posible pasar parámetros de usuario a funciones de escucha. Esto se puede lograr agregando parámetros a la llamada a la función 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 )
Esto permite una gran flexibilidad, obteniendo diferentes comportamientos con la misma definición de detector de eventos.
A veces es necesario acceder a la representación HTML del widget para poder manipular los atributos HTML. La biblioteca permite acceder a esta información fácilmente.
Un ejemplo simple: es el caso en el que le gustaría agregar un texto flotante a un widget. Esto se puede lograr mediante el atributo de título de una etiqueta HTML. Para hacer esto:
widget_instance . attributes [ 'title' ] = 'Your title content'
Un caso especial de atributo HTML es el estilo . Los atributos de estilo se pueden modificar de esta manera:
widget_instance . style [ 'color' ] = 'red'
La asignación de un nuevo atributo lo crea automáticamente.
Para obtener una lista de referencia de atributos HTML, puede consultar https://www.w3schools.com/tags/ref_attributes.asp
Para obtener una lista de referencia de atributos de estilo, puede consultar https://www.w3schools.com/cssref/default.asp
Tenga cuidado con los atributos utilizados internamente. Estos son:
Si está utilizando su aplicación REMI de forma remota, con un DNS y detrás de un firewall, puede especificar parámetros especiales en la llamada start
:
start ( MyApp , address = '0.0.0.0' , port = 8081 )
Sugiero utilizar el navegador como ventana de interfaz estándar.
Sin embargo, puedes evitar el uso del navegador. Esto se puede obtener simplemente uniéndose a REMI y PyWebView. Aquí hay un ejemplo sobre este standalone_app.py.
Tenga en cuenta que PyWebView usa qt, gtk, etc. para crear la ventana. Una versión desactualizada de estas bibliotecas puede causar problemas en la interfaz de usuario. Si tiene problemas con la interfaz de usuario, actualice estas bibliotecas o, mejor, evite la ejecución independiente.
Para limitar el acceso remoto a su interfaz, puede definir un nombre de usuario y una contraseña. Consiste en un sencillo proceso de autenticación. Simplemente defina los parámetros nombre de usuario y contraseña en la llamada de inicio:
start ( MyApp , username = 'myusername' , password = 'mypassword' )
Para definir un nuevo estilo para su aplicación, debe hacer lo siguiente. Crea una carpeta res y pásala al constructor de tu clase de aplicación:
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 })
Copie el archivo style.css estándar de la carpeta remi y péguelo dentro de su carpeta res . Edítalo para personalizarlo. De esta manera, el archivo style.css estándar será anulado por el que usted creó.
Remi está diseñado para ser compatible desde Python2.7 a Python3.X. Por favor notifique problemas de compatibilidad.
Remi debería estar pensado como un marco de GUI de escritorio estándar. La biblioteca en sí no implementa estrategias de seguridad, por lo que se recomienda no exponer su acceso a redes públicas inseguras.
Al cargar datos de fuentes externas, considere proteger la aplicación de una posible inyección de JavaScript antes de mostrar el contenido directamente.
PySimpleGUI: lanzado en 2018 Desarrollado y respaldado activamente. Admite tkinter, Qt, WxPython, Remi (en el navegador). Cree GUI de diseño personalizado de forma sencilla. Soporte para Python 2.7 y 3. Más de 100 programas de demostración y libros de cocina para un inicio rápido. Amplia documentación.
Plantilla de aplicación para REMI: una plantilla muy bien escrita para aplicaciones multivista.
Reconfiguración dinámica basada en web para robots ROS
razmq
Espresso-BRAZO
PiPresenta
El marco de Python Banyan
Administrador de espectáculos LightShowPi
rElectrum: un poderoso y prometedor administrador de billetera Electrum para transacciones seguras.
Aquí se enumeran otras implementaciones de esta biblioteca: