Remi เป็นไลบรารี GUI สำหรับแอปพลิเคชัน Python ที่ได้รับการเรนเดอร์ในเว็บเบราว์เซอร์ สิ่งนี้ช่วยให้คุณเข้าถึงอินเทอร์เฟซของคุณทั้งภายในและจากระยะไกล
Reddit - (subreddit RemiGUI)
นอกจากนี้ยังมี ตัวแก้ไข GUI แบบลากและวาง ดูที่โฟลเดอร์ย่อยของ Editor เพื่อดาวน์โหลดสำเนาของคุณ
วิดีโอสาธิตจากห้องปฏิบัติการ REVVEN ที่ยอดเยี่ยม
สำหรับเวอร์ชัน เสถียร :
pip install remi
สำหรับเวอร์ชัน ทดลองที่ อัปเดตล่าสุด ดาวน์โหลดหรือดู Remi จาก git และติดตั้ง
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 Kbytes เหมาะสำหรับการควบคุมอาหารของคุณ
Remi ช่วยให้นักพัฒนาสามารถสร้าง GUI ที่ไม่ขึ้นอยู่กับแพลตฟอร์มด้วย Python 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" คุณสามารถเปลี่ยนที่อยู่ URL ตาม **kwargs เฉพาะเมื่อ start
การเรียกใช้ฟังก์ชัน เรื่องนี้จะมีการหารือในภายหลัง
ทดสอบบน Android, Linux, Windows มีประโยชน์กับ Raspberry Pi สำหรับการพัฒนาสคริปต์ Python อนุญาตให้โต้ตอบกับ Raspberry Pi ของคุณจากระยะไกลจากอุปกรณ์มือถือของคุณ
ทำไมต้องมี GUI lib อื่น Kivy, PyQT และ PyGObject ล้วนต้องการโค้ดเนทิฟสำหรับระบบปฏิบัติการโฮสต์ ซึ่งหมายถึงการติดตั้งหรือคอมไพล์การขึ้นต่อกันจำนวนมาก Remi ต้องการเพียงเว็บเบราว์เซอร์เพื่อแสดง GUI ของคุณ
ฉันจำเป็นต้องรู้ HTML หรือไม่? ไม่ ไม่จำเป็น คุณต้องเขียนโค้ดเป็นภาษา Python เท่านั้น
มันเป็นโอเพ่นซอร์สหรือไม่? แน่นอน! Remi ได้รับการเผยแพร่ภายใต้ Apache License ดูไฟล์ 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 ของตัวเองเป็นผู้ฟังสำหรับเหตุการณ์ onclick ที่เปิดเผยโดยวิดเจ็ตปุ่ม ง่ายง่าย
การเรียกกลับของผู้ฟังจะได้รับอินสแตนซ์ของตัวส่งเป็นอันดับแรก จากนั้นจึงตามด้วยพารามิเตอร์อื่นๆ ทั้งหมดที่เหตุการณ์เฉพาะมีให้
นอกจากการลงทะเบียนเหตุการณ์มาตรฐาน (ดังที่กล่าวไปแล้ว) ยังสามารถส่งพารามิเตอร์ผู้ใช้ไปยังฟังก์ชัน Listener ได้ ซึ่งสามารถผนวกพารามิเตอร์เข้ากับการเรียกใช้ฟังก์ชัน 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 )
ซึ่งให้ความยืดหยุ่นอย่างมาก โดยรับลักษณะการทำงานที่แตกต่างกันด้วยคำจำกัดความ Listener เหตุการณ์เดียวกัน
บางครั้งจำเป็นต้องเข้าถึงการแสดง HTML ของ Widget เพื่อจัดการคุณลักษณะ HTML ห้องสมุดช่วยให้สามารถเข้าถึงข้อมูลนี้ได้อย่างง่ายดาย
ตัวอย่างง่ายๆ: เป็นกรณีที่คุณต้องการเพิ่มข้อความโฮเวอร์ลงในวิดเจ็ต ซึ่งสามารถทำได้โดยแอตทริบิวต์ title ของแท็ก HTML เพื่อดำเนินการนี้:
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
ดูแลเกี่ยวกับคุณลักษณะที่ใช้ภายใน เหล่านี้คือ:
หากคุณใช้แอป REMI จากระยะไกลด้วย DNS และอยู่หลังไฟร์วอลล์ คุณสามารถระบุพารามิเตอร์พิเศษใน 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 })
คัดลอกไฟล์ style.css มาตรฐานจากโฟลเดอร์ remi และวางลงในโฟลเดอร์ res ของคุณ แก้ไขเพื่อปรับแต่ง วิธีนี้จะทำให้ไฟล์ style.css มาตรฐานถูกแทนที่โดยไฟล์ที่คุณสร้างขึ้น
Remi สร้างมาให้เข้ากันได้ตั้งแต่ Python2.7 ถึง Python3.X กรุณาแจ้งปัญหาความเข้ากันได้
Remi ควรมีวัตถุประสงค์เพื่อเป็นเฟรมเวิร์ก GUI เดสก์ท็อปมาตรฐาน ห้องสมุดไม่ได้ใช้กลยุทธ์ด้านความปลอดภัย ดังนั้นจึงขอแนะนำว่าอย่าเปิดเผยการเข้าถึงเครือข่ายสาธารณะที่ไม่ปลอดภัย
เมื่อโหลดข้อมูลจากแหล่งภายนอก ให้พิจารณาปกป้องแอปพลิเคชันจากการแทรก JavaScript ก่อนที่จะแสดงเนื้อหาโดยตรง
PySimpleGUI: เปิดตัวในปี 2561 พัฒนาและสนับสนุนอย่างแข็งขัน รองรับ tkinter, Qt, WxPython, Remi (ในเบราว์เซอร์) สร้าง GUI รูปแบบที่กำหนดเองได้ง่ายๆ รองรับ Python 2.7 และ 3 โปรแกรมสาธิตและตำราอาหารมากกว่า 100 รายการเพื่อการเริ่มต้นอย่างรวดเร็ว เอกสารที่กว้างขวาง
เทมเพลตแอปสำหรับ REMI: เทมเพลตที่เขียนมาอย่างดีสำหรับแอปพลิเคชันแบบหลายมุมมอง
การกำหนดค่าแบบไดนามิกบนเว็บสำหรับหุ่นยนต์ ROS
ราซเอ็มคิว
เอสเปรสโซ-อาร์ม
PiPresents
Python Banyan Framework
ผู้จัดการการแสดง LightShowPi
rElectrum: ผู้จัดการกระเป๋าเงิน Electrum ที่มีแนวโน้มอันทรงพลังสำหรับการทำธุรกรรมที่ปลอดภัย
รายการต่อไปนี้คือการใช้งานอื่นๆ ของไลบรารีนี้: