1

我一直在为 Pymol(大分子结构的可视化软件)编写一个插件。为此,我使用 python 和 tkinter。

我的插件可以工作,我可以在 Pymol“插件”菜单中注册它。

从 Pymol 自带的插件管理器安装 plugin.py 文件后,有三个选项可以启动插件:

1) 插件菜单 --> "插件名称" | 适用于 Linux 和 Windows

2) Pymol 命令行 --> Testplugin | 仅适用于 Linux

3) 从 Pymol 主窗口 CTRL+F | 仅适用于 Linux

我在 Windows 机器上的情况 2 和 3 中得到的错误如下:

Traceback (most recent call last):
  File "C:\Program Files (x86)\PyMOL_1760\PyMOL/modules\pymol\parser.py", line 256, in parse
    self.result=apply(layer.kw[0],layer.args,layer.kw_args)
  File "C:\Program Files (x86)\PyMOL_1760\PyMOL/modules\pmg_tk\startup\tkintertest.py", line 43, in showWindow
    top = Toplevel(parent)
  File "C:\Program Files (x86)\PyMOL_1760\PyMOL\py27\lib\lib-tk\Tkinter.py", line 2017, in __init__
    BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)
  File "C:\Program Files (x86)\PyMOL_1760\PyMOL\py27\lib\lib-tk\Tkinter.py", line 1974, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
TclError: out of stack space (infinite loop?)

我在下面提供了一个最小的“工作”插件代码。这一切只是打开一个新窗口并显示一个标签“Testlabel”。同样,您可以在 Linux 上使用所有三种方法从 Pymol 启动插件,而在 Windows 上只有第一种方法有效,其他两种方法会出现上述堆栈外错误。这已经用不同的 Windows/Linux/Pymol 版本进行了测试。

最小代码示例:

#! /usr/bin/env python

from Tkinter import *
from pymol import cmd, plugins


class Testplugin(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.pack()      
        self.create_widgets()

    def create_widgets(self):

        self.labelTest = Label(self,
            text = "Testlabel"
        )

        self.labelTest.grid(
            in_ = self,
            column = 1,
            row = 1,
            columnspan = 1,
            ipadx = 0,
            ipady = 0,
            padx = 0,
            pady = 0,
            rowspan = 1,
            sticky = "n"
        )

        self.grid_rowconfigure(1, minsize = 30, pad = 3)
        self.grid_columnconfigure(1, minsize = 30, pad = 3)


def __init__(self):
    self.menuBar.addmenuitem("Plugin", "command", label="Testplugin", command = showWindow)

def showWindow():
    parent = plugins.get_tk_root()
    top = Toplevel(parent)
    frame = Testplugin(top)

cmd.extend("Testplugin", showWindow)
cmd.set_key("CTRL-F", showWindow)

先感谢您!

4

0 回答 0