python - Tkinter 'out of stack space' fejl med Pymol på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har skrevet et plugin til Pymol (visualiseringssoftware til makromolekylære strukturer). Til dette bruger jeg python og tkinter.


Mit plugin virker, og jeg kan registrere det i Pymol 'Plugin' Menu.


Efter installationen af ​​plugin.py filen fra Pymol-egen plugin manager er der tre muligheder for at starte plugin'et:


1) Plugin Menu -> 'Plugin Name' | Fungerer på Linux og Windows


2) Pymol Command Line -> Testplugin | Fungerer kun på Linux


3) fra hovedmenuen Pymol CTRL + F | Fungerer kun på Linux


Fejlen jeg får i sager 2 og 3 på Windows-maskiner er følgende:


Traceback (most recent call last):
  File "C:Program Files (x86)PyMOL\_1760PyMOL/modulespymolparser.py", line 256, in parse
    self.result=apply(layer.kw[0],layer.args,layer.kw\_args)
  File "C:Program Files (x86)PyMOL\_1760PyMOL/modulespmg\_tkstartup	kintertest.py", line 43, in showWindow
    top = Toplevel(parent)
  File "C:Program Files (x86)PyMOL\_1760PyMOLpy27liblib-tkTkinter.py", line 2017, in \_\_init\_\_
    BaseWidget.\_\_init\_\_(self, master, 'toplevel', cnf, {}, extra)
  File "C:Program Files (x86)PyMOL\_1760PyMOLpy27liblib-tkTkinter.py", line 1974, in \_\_init\_\_
    (widgetName, self.\_w) + extra + self.\_options(cnf))
TclError: out of stack space (infinite loop?)


Jeg har angivet en minimal 'arbejder' plugin kode nedenfor. Alt dette gør, er bare at åbne et nyt vindue og vise en etiket 'Testlabel'. Igen kan du starte pluginet fra Pymol på Linux med alle tre metoder, mens kun Windows fungerer den første metode, og de to andre giver fejlen ud af stakken ovenfor. Dette er blevet testet med forskellige Windows/Linux/Pymol versioner.


Minimal kodeeksempel:


#! /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)


Tak på forhånd!

Bedste reference