1

我想通过 matplotlib 库绘制一个图形,并从 PyMOL 将其作为单独的Tkinter (Tk) 窗口调用。看起来这个任务并不简单,因为它需要几个线程以及一些 matplotlib/Tk 的调整调整(https://github.com/speleo3/pymol-psico/blob/master/psico/matplotlib_fix.py) . Matplotlib 提供了一种所谓的交互模式,我在下面的简化示例中实现了它。如果我将其作为插件安装,此代码在 Windows 上运行良好。相反,它在 Mac 上崩溃,当我使用命令“run”从 cmd 运行它时也会崩溃。

问题:如何在 PyMOL 会话中创建一个新的 Tk 窗口/线程并在其上输出 matplotlib 图?

from pymol import cmd, stored
from Tkinter import *
import numpy
import matplotlib
matplotlib.use('TkAgg')

class Plotter:
    def plotDistances(self, x, y):
        plt.figure()
        plt.plot(x, y, 'o')
        plt.tight_layout()
        plt.ion()
        plt.show()

graph1 = Plotter()
xtest = numpy.linspace(1, 300, 300)
ytest = numpy.linspace(1, 300, 300)
graph1.plotDistances(xtest,ytest)
4

1 回答 1

0

我找到了解决方案。希望这会有所帮助:

import pymol
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends import backend_tkagg

def _new_figure_manager(num, *args, **kwargs):
    # import pymol
    if pymol._ext_gui is None:
        return new_figure_manager(num, *args, **kwargs)
    backend_tkagg.show._needmain = False
    import Tkinter as Tk
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, FigureManagerTkAgg
    FigureClass = kwargs.pop('FigureClass', Figure)
    print kwargs
    figure = FigureClass(*args, **kwargs)
    window = Tk.Toplevel(master=pymol._ext_gui.root)
    canvas = FigureCanvasTkAgg(figure, master=window)
    figManager = FigureManagerTkAgg(canvas, num, window)
    if matplotlib.is_interactive():
        figManager.show()
    return figManager

new_figure_manager = backend_tkagg.new_figure_manager
backend_tkagg.new_figure_manager = _new_figure_manager

matplotlib.interactive(True)
from matplotlib.figure import Figure
from matplotlib.pyplot import *

import numpy
x = numpy.linspace(1, 300, 300)
y = numpy.linspace(1, 300, 300)

fig1 = figure()
plot = fig1.add_subplot(111)
plot.scatter(x, y)

fig2 = figure()
plot = fig2.add_subplot(111)
plot.scatter(x, 2*y)
于 2015-03-25T13:36:25.650 回答