質問

プラグインをサポートするPYQT4プログラムを作成したいと思います。基本的に、ユーザーにPYQT4にQWidgetサブクラスを書き込み、GUIを介してメインアプリケーションウィンドウから追加/削除できるようにしたいと考えています。それ、特にプラグインメカニズムをどのように行いますか?

役に立ちましたか?

解決

まず、aを使用します qfileedialog より便利に静的関数 qfileedialog.getopenfileName ユーザーに選択させます .py ファイルGUIを「プラグイン」したい。

次に、プラグインのインポートをから許可したい場合 どこでも ディスク上(とは対照的に、以前に追加された特定のディレクトリから sys.path, 、たとえば、環境変数を介して PYTHONPATH)、あなたは「それを正しく行う」ことができます(無視できない量の作業) インプ 標準のPythonライブラリのモジュール)、または次のように「角を切る」ことができます(仮定 filepath それは QString ファイルへのパスを使用して、ネイティブなUnicodeファイル名を備えたファイルシステム/プラットフォームを使用していることをお勧めします - それ以外の場合は、何でも追加する必要があります .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では、プラグインが実装する必要がある多くの機能を定義することでした。必要な基本的な重要な要素は、プラグイン内のものの名前(ユーザーがそれらをインスタンス化できるようにUIに表示できるように)と実際に物を作成する工場です。 Pythonでは、モジュールから戻ることができる1つのdictとしてそれらを行うことはかなり些細なことだと思います。

たとえば、すべてのプラグインが、名前の辞書を返すgetPluginInfo()という関数を作成する必要があることを宣言します。クラスマッピング。

実際に考えているので、おそらくファイルをインポートし、気にするもののサブクラスであるクラスを探すことができ、明示的なAPIを実装する必要がないクラスを探すことができます。私はそれをたくさんしたことがありませんが、基本的にはモジュールのdir()を歩いてテストして、それぞれがqwidgetのサブクラスであるかどうかを確認します(たとえば)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top