Frage

Ich möchte ein PyQt4 Programm, das unterstützt Plug-ins machen. Grundsätzlich möchte ich der Benutzer in der Lage sein QWidget Subklassen in PyQt4 und hinzufügen / entfernen sie aus dem Hauptfenster über eine GUI zu schreiben. Wie würde ich das tun, vor allem den Plugin-Mechanismus?

War es hilfreich?

Lösung

Verwenden Sie zuerst ein QFileDialog oder bequemer die statische Funktion QFileDialog.getOpenFileName lassen Sie die Benutzer wählen sie die Datei .py sie „in Plug“ Ihre GUI zu wollen.

Als nächstes, wenn Sie aus dem Import das Plugin erlauben überall auf der Festplatte (im Gegensatz zu, von bestimmten Verzeichnissen zuvor hinzugefügt, um Ihre sys.path, zum Beispiel über die Umgebungsvariable PYTHONPATH), können Sie " es richtig“(eine nicht vernachlässigbare Menge an Arbeit) über die imp Modul in die Standard-Python-Bibliothek), oder Sie kann „cut corners“ wie folgt (unter der Annahme filepath ist die QString mit dem Pfad zur Datei, und dass Sie ein Dateisystem / Plattform mit nativen Unicode-Dateinamen verwenden - sonst werden Sie müssen addieren, was .encode Ihre Plattform und Dateisystem benötigen) ...:

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)

Dies ist nicht Thread-sicher, da es eine Nebenwirkung auf sys.path haben kann, weshalb ich sagte es der „cutting corners“ ... aber dann, Thread-sichere Importe machen (und „saubere“ Importe aus „überall „) ist wirklich harte Arbeit (wahrscheinlich lohnt eine andere Frage, wenn Sie benötigen, da es nichts wirklich viel mit dem Kern dieser eine oder PyQt, usw).

zu tun

Wenn Sie das Modulobjekt tun haben (das Ergebnis aus importfrom oben), schlage ich vor:

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)]

Gibt eine Liste mit all dem Widget Klassen (falls vorhanden) definiert (auf der obersten Ebene) in Modul amodule.

Was möchten Sie als Nächstes zu tun ist, bis zu Ihnen, natürlich. Vielleicht möchten Sie eine Art von Fehlermeldungen geben, wenn die Liste leer ist (oder vielleicht auch, wenn es mehr als ein Element hat? Oder sonst wie die Widget-Klasse Verwendung entscheiden?) Oder auch instantiate die Widget-Klasse (wie oft? zu welchen Koordinaten und so weiter -. Fragen können nur Sie beantworten) und zeigt die resultierenden Widget (s) in der entsprechenden Stelle (n) auf dem Fenster

Andere Tipps

Haben Sie ein Verzeichnis für die Plugins, eine Schnittstelle für die Plug-ins definieren, und gehen Sie das Verzeichnis sie importieren.

Ich habe noch nie diese in Python getan, aber in C so, wie ich es tat, war eine Reihe von Funktionen zu definieren, dass das Plugin benötigt umzusetzen. Die grundlegenden Schlüsselelemente, die notwendig sind, sind der Name der Dinge im Plugin (so dass Sie sie in Ihrer Benutzeroberfläche angezeigt werden können, so dass der Benutzer sich instanziiert kann) und eine Fabrik, um tatsächlich die Dinge zu schaffen. Ich in Python nehme an, es ist ziemlich trivial sein würde, nur diejenigen, die als ein dict zu tun, dass Sie aus dem Modul zurückkehren kann.

z. erklären, dass alle Plugins eine Funktion Autor muss aufgerufen GetPluginInfo (), die ein Wörterbuch des Namens gibt. Klasse Zuordnungen

Eigentlich jetzt, dass ich darüber nachdenken konnte man wahrscheinlich importieren Sie einfach die Datei und das Aussehen für Klassen, die Unterklassen sind, was Sie kümmern uns um und benötigen keine explizite API implementiert werden. Ich habe nicht viel getan, aber im Grunde würden Sie die Modul dir gehen () und Test, um zu sehen, ob jedes Ding eine Unterklasse von QWidget (zum Beispiel) ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top