Remi는 웹 브라우저에서 렌더링되는 Python 애플리케이션용 GUI 라이브러리입니다. 이를 통해 인터페이스에 로컬 및 원격으로 액세스할 수 있습니다.
Reddit - (하위 레딧 RemiGUI)
드래그 앤 드롭 GUI 편집기 도 있습니다. 사본을 다운로드하려면 Editor 하위 폴더를 살펴보세요.
훌륭한 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 라이브러리. 100KB 미만의 소스 코드로 다이어트에 딱 맞습니다.
Remi를 사용하면 개발자가 Python을 사용하여 플랫폼 독립적인 GUI를 만들 수 있습니다. 전체 GUI가 브라우저에서 렌더링됩니다. HTML이 필요하지 않습니다 . Remi는 자동으로 Python 코드를 HTML로 변환합니다. 앱이 시작되면 네트워크에서 액세스할 수 있는 웹 서버가 시작됩니다.
기본 애플리케이션은 다음과 같습니다.
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에서 테스트되었습니다. Python 스크립트 개발을 위해 Raspberry Pi에서 유용합니다. 이를 통해 모바일 장치에서 원격으로 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
함수를 선언합니다. 메인 함수 내에서 루트 위젯을 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)는 자체의 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 )
이를 통해 동일한 이벤트 리스너 정의로 다양한 동작을 얻을 수 있어 유연성이 뛰어납니다.
때로는 HTML 속성을 조작하기 위해 위젯의 HTML 표현에 접근해야 하는 경우도 있습니다. 라이브러리를 사용하면 이 정보에 쉽게 접근할 수 있습니다.
간단한 예: 위젯에 호버 텍스트를 추가하고 싶은 경우입니다. 이는 HTML 태그의 title 속성을 통해 달성할 수 있습니다. 이를 수행하려면 다음을 수행하십시오.
widget_instance . attributes [ 'title' ] = 'Your title content'
HTML 속성의 특별한 경우는 스타일 입니다. 스타일 속성은 다음과 같은 방법으로 변경할 수 있습니다.
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에 가입하면 간단히 얻을 수 있습니다. 다음은 이 독립형_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 로봇을 위한 웹 기반 동적 재구성
razmq
에스프레소-ARM
PiPresents
Python Banyan 프레임워크
LightShowPi 쇼 매니저
rElectrum: 안전한 거래를 위한 강력하고 유망한 Electrum 지갑 관리자입니다.
이 라이브러리의 다른 구현은 다음과 같습니다.