Remi هي مكتبة واجهة المستخدم الرسومية لتطبيقات Python والتي يتم عرضها في متصفحات الويب. يتيح لك هذا الوصول إلى الواجهة الخاصة بك محليًا وعن بعد.
رديت - (subreddit RemiGUI)
يوجد أيضًا محرر واجهة المستخدم الرسومية بالسحب والإسقاط . انظر إلى مجلد المحرر الفرعي لتنزيل نسختك.
فيديو توضيحي من مختبرات REVVEN الرائعة
للحصول على نسخة مستقرة :
pip install remi
للحصول على أحدث إصدار تجريبي ، قم بتنزيل Remi أو التحقق منه من git وتثبيته
python setup.py install
أو التثبيت مباشرة باستخدام النقطة
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 كيلو بايت من كود المصدر، مثالي لنظامك الغذائي.
يمكّن Remi المطورين من إنشاء واجهة مستخدم رسومية مستقلة عن النظام الأساسي باستخدام Python. يتم عرض واجهة المستخدم الرسومية بالكامل في متصفحك. ليس هناك حاجة إلى 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
استدعاء الوظيفة. سيتم مناقشة هذا لاحقا.
تم اختباره على أندرويد، لينكس، ويندوز. مفيد في Raspberry Pi لتطوير البرنامج النصي Python. فهو يسمح بالتفاعل مع Raspberry Pi الخاص بك عن بعد من جهازك المحمول.
لماذا ليب واجهة المستخدم الرسومية آخر؟ تتطلب كل من Kivy وPyQT وPyGObject تعليمات برمجية أصلية لنظام التشغيل المضيف، مما يعني تثبيت التبعيات الكبيرة أو تجميعها. يحتاج Remi فقط إلى متصفح ويب لإظهار واجهة المستخدم الرسومية الخاصة بك.
هل أحتاج إلى معرفة HTML؟ لا، ليس مطلوبًا، يجب عليك البرمجة بلغة بايثون فقط.
هل هو مفتوح المصدر؟ بالتأكيد! تم إصدار Remi بموجب ترخيص Apache. راجع ملف LICENSE
لمزيد من التفاصيل.
هل أحتاج إلى نوع من خادم الويب؟ لا، انها مدرجة.
استيراد مكتبة ريمي وبعض الأشياء المفيدة الأخرى.
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 )
قم بتشغيل البرنامج النصي. إذا كان كل شيء على ما يرام، فسيتم فتح واجهة المستخدم الرسومية تلقائيًا في متصفحك، وإلا فسيتعين عليك كتابة "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 وهما:
تعرض الأدوات مجموعة من الأحداث التي تحدث أثناء تفاعل المستخدم. تعتبر مثل هذه الأحداث طريقة ملائمة لتحديد سلوك التطبيق. تحتوي كل أداة على عمليات رد اتصال خاصة بها، اعتمادًا على نوع تفاعل المستخدم الذي تسمح به. سيتم توضيح عمليات الاسترجاعات المحددة للأدوات لاحقًا.
من أجل تسجيل دالة كمستمع للحدث، عليك استدعاء دالة مثل eventsname.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 الذاتية كمستمع للحدث عند النقر الذي يعرضه عنصر واجهة مستخدم الزر. بسيطة وسهلة.
ستتلقى ردود اتصال المستمع نسخة المرسل أولاً، ثم جميع المعلمات الأخرى التي يوفرها الحدث المحدد.
إلى جانب تسجيل الحدث القياسي (كما هو مذكور أعلاه)، من الممكن تمرير معلمات المستخدم إلى وظائف المستمع. يمكن تحقيق ذلك من خلال إلحاق المعلمات باستدعاء دالة 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 الخاص بـ Widget من أجل معالجة سمات HTML. تتيح المكتبة الوصول إلى هذه المعلومات بسهولة.
مثال بسيط: هذه هي الحالة التي تريد فيها إضافة نص تحويم إلى عنصر واجهة المستخدم. يمكن تحقيق ذلك من خلال سمة العنوان لعلامة HTML. من أجل القيام بذلك:
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
اهتم بالسمات المستخدمة داخليًا. هذه هي:
إذا كنت تستخدم تطبيق REMI الخاص بك عن بعد، باستخدام DNS وخلف جدار الحماية، فيمكنك تحديد معلمات خاصة في استدعاء start
:
start ( MyApp , address = '0.0.0.0' , port = 8081 )
أقترح استخدام المتصفح كنافذة واجهة قياسية.
ومع ذلك، يمكنك تجنب استخدام المتصفح. يمكن الحصول على ذلك بسهولة من خلال الانضمام إلى REMI وPyWebView. فيما يلي مثال حول ملف standalone_app.py هذا.
انتبه إلى أن PyWebView يستخدم qt وgtk وما إلى ذلك لإنشاء النافذة. يمكن أن يتسبب الإصدار القديم من هذه المكتبات في حدوث مشكلات في واجهة المستخدم. إذا واجهت مشكلات في واجهة المستخدم، فقم بتحديث هذه المكتبات، أو من الأفضل تجنب التنفيذ المستقل.
من أجل الحد من الوصول عن بعد إلى الواجهة الخاصة بك، يمكنك تحديد اسم المستخدم وكلمة المرور. وهو يتألف من عملية مصادقة بسيطة. ما عليك سوى تحديد اسم المستخدم وكلمة المرور للمعلمات في مكالمة البدء:
start ( MyApp , username = 'myusername' , password = 'mypassword' )
من أجل تحديد نمط جديد لتطبيقك، عليك القيام بما يلي. قم بإنشاء مجلد res وتمريره إلى منشئ فئة التطبيق الخاص بك:
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 بمثابة إطار عمل قياسي لواجهة المستخدم الرسومية لسطح المكتب. المكتبة نفسها لا تنفذ استراتيجيات أمنية، ولذلك ينصح بعدم الكشف عن وصولها إلى الشبكات العامة غير الآمنة.
عند تحميل البيانات من مصادر خارجية، فكر في حماية التطبيق من حقن جافا سكريبت المحتمل قبل عرض المحتوى مباشرة.
PySimpleGUI: تم إطلاقه في عام 2018 وتم تطويره ودعمه بشكل نشط. يدعم tkinter، Qt، WxPython، Remi (في المتصفح). قم بإنشاء واجهة المستخدم الرسومية للتخطيط المخصص بكل بساطة. دعم بايثون 2.7 و3. أكثر من 100 برنامج تجريبي وكتاب الطبخ للبدء السريع. وثائق واسعة النطاق.
قالب التطبيق لـ REMI: قالب مكتوب بشكل جيد لتطبيقات العرض المتعدد.
إعادة التكوين الديناميكي القائم على الويب لروبوتات ROS
رازمق
اسبريسو-ARM
بي يقدم
إطار بايثون بانيان
مدير عرض LightShowPi
rElectrum: مدير محفظة Electrum واعد وقوي للمعاملات الآمنة.
المدرجة هنا هي تطبيقات أخرى لهذه المكتبة: