سؤال

أرغب في عمل برنامج PYQT4 يدعم الإضافات. في الأساس ، أريد أن يتمكن المستخدم من كتابة فئات QWidget الفرعية في PYQT4 وإضافة/إزالتها من نافذة التطبيق الرئيسية عبر واجهة المستخدم الرسومية. كيف أفعل ذلك ، وخاصة آلية البرنامج المساعد؟

هل كانت مفيدة؟

المحلول

أولا ، استخدم أ QfileDialog أو بشكل أكثر ملاءمة الوظيفة الثابتة qfiledialog.getopenfilename للسماح للمستخدم باختيار .py ملف يريدون "توصيل" واجهة المستخدم الرسومية.

بعد ذلك ، إذا كنت تريد السماح باستيراد البرنامج المساعد من في أى مكان على القرص (على عكس ، من الدلائل المحددة التي سبق إضافتها إلى الخاص بك sys.path, ، على سبيل المثال عبر متغير البيئة PYTHONPATH) ، يمكنك "القيام بذلك بشكل صحيح" (كمية غير مؤهلة من العمل) ، عبر عفريت الوحدة النمطية في مكتبة بيثون القياسية) ، أو يمكنك "قطع الزوايا" على النحو التالي (على افتراض filepath هل QString من خلال المسار إلى الملف ، وأنك تستخدم نظام ملفات/منصة مع أسماء ملفات أحادية الصودي .encode يتطلب النظام الأساسي ونظام الملفات) ...:

import sys, os

def importfrom(filepath):
    ufp = unicode(filepath)
    thedir, thefile = os.path.split(ufp)
    if sys.path[0] != thedir:
      sys.path.insert(0, thedir)
    themodule, theext = os.path.splitext(thefile)
    return __import__(themodule)

هذا ليس آمنًا للخيط لأنه قد يكون له تأثير جانبي على sys.path, ، وهذا هو السبب في أنني قلت إنها "قطع زوايا" ... ولكن بعد ذلك ، تجعل الواردات الآمنة الآمنة (و "تنظيف" الواردات من "أي مكان") هي حقًا العمل الشاق (ربما يستحق سؤالًا منفصلاً إذا كنت بحاجة إلى ذلك ، لأنه لا علاقة له حقًا بجهاز هذا الشخص ، أو Pyqt ، & c).

بمجرد الحصول على كائن الوحدة النمطية (النتيجة من importfrom أعلاه) ، أقترح:

from PyQt4 import QtGui 
import inspect

def is_widget(w):
    return inspect.isclass(w) and issubclass(w, QtGui.QWidget)

def all_widget_classes(amodule):
    return [v for n, v in inspect.getmembers(amodule, is_widget)]

هذا يعيد قائمة مع كل القطعة الطبقات (إن وجد) محدد (في المستوى العلوي) في الوحدة النمطية amodule.

ما تريد القيام به بعد ذلك هو الأمر متروك لك بالطبع. ربما تريد أن تعطي نوعًا من رسائل الخطأ إذا كانت القائمة فارغة (أو ربما أيضًا إذا كانت تحتوي على أكثر من عنصر واحد؟ وإلا كيف يتم تحديد فئة القطعة التي يجب استخدامها؟) أو إنشاء فئة عنصر واجهة المستخدم (كم مرة؟ في أي إحداثيات؟ وما إلى ذلك - أسئلة فقط يمكنك الإجابة عليها) وإظهار القطعة الناتجة الناتجة في المكان (البقع) المناسبة على نافذتك.

نصائح أخرى

احصل على دليل للمكونات الإضافية ، وتحديد واجهة لتلك الإضافات ، والمشي في الدليل الذي يستوردها.

لم أفعل ذلك مطلقًا في Python ، ولكن في C ، كانت الطريقة التي فعلت بها تحديد عدد من الوظائف التي يحتاجها المكون الإضافي للتنفيذ. العناصر الرئيسية الأساسية الضرورية هي اسم الأشياء في البرنامج المساعد (بحيث يمكنك عرضها في واجهة المستخدم الخاصة بك حتى يتمكن المستخدم من إنشاء مثيل لها) ومصنع لإنشاء الأشياء بالفعل. أفترض في Python أنه سيكون من التافهة إلى حد ما أن تفعل تلك القللة التي يمكنك العودة من الوحدة النمطية.

على سبيل المثال ، أعلن أن جميع المكونات الإضافية يجب أن مؤلف وظيفة تسمى getPluginInfo () التي تُرجع قاموس الاسم: تعيينات الفئة.

في الواقع الآن بعد أن فكرت في الأمر ، ربما يمكنك فقط استيراد الملف والبحث عن فئات فرعية من كل ما تهتم به ولا تتطلب أي واجهة برمجة تطبيقات صريحة. لم أفعل الكثير من ذلك ، لكن في الأساس ، كنت تمشي في Dir () للوحدة واختبار لمعرفة ما إذا كان كل شيء فئة فرعية من QWidget (على سبيل المثال).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top