Remi 是一个用于在 Web 浏览器中呈现的 Python 应用程序的 GUI 库。这允许您本地和远程访问您的界面。
Reddit -(Reddit 子版 RemiGUI)
还有一个拖放 GUI 编辑器。查看编辑器子文件夹以下载您的副本。
来自伟大的 REVVEN 实验室的演示视频
对于稳定版本:
pip install remi
获取最新的实验版本 从 git 下载或查看 Remi 并安装
python setup.py install
或者直接使用pip安装
pip install git+https://github.com/rawpython/remi.git
然后启动测试脚本(从github下载https://github.com/rawpython/remi/blob/master/examples/widgets_overview_app.py):
python widgets_overview_app.py
平台无关的 Python GUI 库。源代码不到 100 KB,非常适合您的饮食。
Remi 使开发人员能够使用 Python 创建独立于平台的 GUI。整个 GUI 将在您的浏览器中呈现。不需要 HTML ,Remi 会自动将您的 Python 代码转换为 HTML。当您的应用程序启动时,它会启动一个可在您的网络上访问的 Web 服务器。
一个基本的应用程序如下所示:
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 )
要查看用户界面,请打开您的首选浏览器并输入“http://127.0.0.1:8081”。您可以在start
函数调用时通过特定的 **kwargs 更改 URL 地址。这将在稍后讨论。
在 Android、Linux、Windows 上进行了测试。在 Raspberry Pi 上用于 Python 脚本开发很有用。它允许从您的移动设备远程与您的 Raspberry Pi 交互。
为什么还要另一个 GUI 库? Kivy、PyQT 和 PyGObject 都需要主机操作系统的本机代码,这意味着安装或编译大量依赖项。 Remi 只需要一个网络浏览器即可显示您的 GUI。
我需要了解 HTML 吗?不,这不是必需的,您只需使用 Python 进行编码。
它是开源的吗?一定! Remi 是根据 Apache 许可证发布的。有关更多详细信息,请参阅LICENSE
文件。
我需要某种网络服务器吗?不,它已包含在内。
导入 Remi 库和其他一些有用的东西。
import remi . gui as gui
from remi import start , App
子类化App
类并声明一个将作为应用程序入口点的main
函数。在 main 函数中,您必须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
在主类之外,通过调用函数start
并将先前声明的类的名称作为参数传递来启动应用程序:
# starts the webserver
start ( MyApp , port = 8081 )
运行脚本。如果一切正常,GUI 将在浏览器中自动打开,否则,您必须在地址栏中输入“http://127.0.0.1:8081”。
您可以在start
调用中自定义可选参数,例如:
start ( MyApp , address = '127.0.0.1' , port = 8081 , multiple_instance = False , enable_file_cache = True , update_interval = 0.1 , start_browser = True )
参数:
附加参数:
所有小部件构造函数都接受两个标准**kwargs,它们是:
小部件公开了用户交互期间发生的一组事件。此类事件是定义应用程序行为的便捷方法。每个小部件都有自己的回调,具体取决于它允许的用户交互类型。稍后将说明小部件的具体回调。
为了将函数注册为事件监听器,您必须调用像 eventname.do (即 onclick.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 ( '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 )
在所示示例中, self.bt.onclick.do(self.on_button_pressed)将 self 的on_button_pressed函数注册为 Button 小部件公开的onclick事件的侦听器。简单、容易。
侦听器的回调将首先接收发射器的实例,然后接收特定事件提供的所有其他参数。
除了标准事件注册(如上所述)之外,还可以将用户参数传递给侦听器函数。这可以实现向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 )
这提供了极大的灵活性,可以使用相同的事件侦听器定义获得不同的行为。
有时需要访问 Widget 的 HTML 表示形式才能操作 HTML 属性。该图书馆允许轻松访问这些信息。
一个简单的例子:您想向小部件添加悬停文本。这可以通过 HTML 标签的title属性来实现。为此:
widget_instance . attributes [ 'title' ] = 'Your title content'
HTML 属性的一个特例是style 。可以通过以下方式更改样式属性:
widget_instance . style [ 'color' ] = 'red'
新属性的分配会自动创建它。
有关 HTML 属性的参考列表,您可以参考 https://www.w3schools.com/tags/ref_attributes.asp
样式属性的参考列表,可以参考https://www.w3schools.com/cssref/default.asp
注意内部使用的属性。这些都是:
如果您通过 DNS 并在防火墙后面远程使用 REMI 应用程序,则可以在start
调用中指定特殊参数:
start ( MyApp , address = '0.0.0.0' , port = 8081 )
我建议使用浏览器作为标准界面窗口。
但是,您可以避免使用浏览器。这可以简单地通过连接 REMI 和 PyWebView 来获得。这是关于此standalone_app.py 的示例。
请注意,PyWebView 使用 qt、gtk 等来创建窗口。这些库的过时版本可能会导致 UI 问题。如果您遇到 UI 问题,请更新这些库,或者最好避免独立执行。
为了限制对您的界面的远程访问,您可以定义用户名和密码。它由一个简单的身份验证过程组成。只需在开始调用中定义参数用户名和密码即可:
start ( MyApp , username = 'myusername' , password = 'mypassword' )
为了为您的应用程序定义新的样式,您必须执行以下操作。创建一个res文件夹并将其传递给您的 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 })
从 remi 文件夹中复制标准 style.css 文件并将其粘贴到res文件夹中。编辑它以进行自定义。这样,标准style.css文件就会被您创建的文件覆盖。
Remi 兼容 Python2.7 到 Python3.X。请告知兼容性问题。
Remi 应该作为一个标准的桌面 GUI 框架。图书馆本身没有实施安全策略,因此建议不要将其访问暴露于不安全的公共网络。
从外部源加载数据时,请考虑在直接显示内容之前保护应用程序免受潜在的 JavaScript 注入的影响。
PySimpleGUI:2018 年推出,积极开发和支持。支持 tkinter、Qt、WxPython、Remi(在浏览器中)。简单地创建自定义布局 GUI。 Python 2.7 和 3 支持。 100 多个演示程序和快速入门指南。广泛的文档。
REMI 的应用程序模板:一个编写得非常好的多视图应用程序模板。
ROS 机器人基于 Web 的动态重新配置
拉兹米克
浓缩咖啡-ARM
Pi礼物
Python Banyan 框架
LightShowPi 演出管理器
rElectrum:一个功能强大、前景广阔的 Electrum 钱包管理器,可实现安全交易。
这里列出了该库的其他实现: