可插入的Python程序

时间:2010-08-28 00:28:05

标签: python qt plugins pyqt4 pluggable

我想制作一个支持插件的PyQt4程序。基本上我希望用户能够在PyQt4中编写QWidget子类,并通过GUI从主应用程序窗口添加/删除它们。我该怎么做,尤其是插件机制?

2 个答案:

答案 0 :(得分:6)

首先,使用QFileDialog或更方便的静态函数QFileDialog.getOpenFileName让用户选择他们想要“插入”GUI的.py文件。

接下来,如果您想允许从磁盘上的任何地方导入插件(而不是之前添加到sys.path的特定目录,例如通过环境变量{{ 1}}),您可以通过标准Python库中的imp模块“正确地”(不可忽略的工作量),或者您可以“切角”如下(假设{{ 1}}是带有文件路径的PYTHONPATH,并且您正在使用具有本机Unicode文件名的文件系统/平台 - 否则您将不得不添加filepath您的平台和文件系统需要)...

QString

这不是线程安全的,因为它可能会对.encode产生副作用,这就是为什么我说它是“偷工减料”......然后,进行线程安全的导入(和“干净”)从“任何地方”进口)是真正的努力工作(如果你需要的话,可能值得一个单独的问题,因为它与这个的要点没有任何关系,或PyQt,& c)

一旦你有了模块对象(上面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

这将返回一个列表,其中包含模块importfrom中定义的所有窗口小部件(如果有)(在顶层)。

接下来你要做的事情当然取决于你。如果列表为空(或者如果它有多个项目,或者如何决定使用哪个窗口小部件类?)或者实例化窗口小部件类(多少次?),也许你想提供某种错误消息?在什么坐标?等等 - 只有你可以回答的问题)并在你窗口的适当位置显示结果小部件。

答案 1 :(得分:0)

拥有插件的目录,为这些插件定义一个接口,然后遍历导入它们的目录。

我从来没有在Python中做到这一点,但在C语言中我采用的方式是定义插件需要实现的许多函数。必要的基本关键元素是插件中的东西的名称(以便您可以在UI中显示它们以便用户可以实例化它们)和工厂实际创建的东西。我想在Python中,将这些作为一个dict可以从模块返回是非常简单的。

E.g。声明所有插件都必须创建一个名为GetPluginInfo()的函数,该函数返回一个名称字典:class mappings。

实际上现在我考虑过它你可能只是导入文件并查找属于你关心的任何子类的类,而不需要实现任何显式的API。我没有做过很多,但基本上你会走模块的dir()并测试看看每个东西是否是QWidget的子类(例如)。