我一直在为 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)
先感谢您!