2017-10-12 3 views
1

Hey Ich möchte den Prozess des Importierens und Neuladen von Skripten mit Python in Maya verstehen.Maya Python Aufruf Modul Klasse Funktionen

Ich habe den folgenden Code, die folgenden Fehler Würfe:

# NameError: name 'MyClass' is not defined # 

Es schafft das Fenster, aber wenn ich die Taste drücken, es gibt mir den Fehler oben. Wäre toll wenn mir jemand helfen könnte was ich hier vermisse.

import maya.cmds as cmds 
from functools import partial 

class MyClass(): 

    @classmethod 
    def createWindow(cls): 

     windowID = 'window' 

     if cmds.window(windowID, exists = True): 
      cmds.deleteUI('window') 

     window = cmds.window(windowID, title="Blast", iconName='Blast', widthHeight=(400, 200)) 
     cmds.frameLayout(label='') 

     cmds.button(label='Playblast' ,command= 'MyClass.createPlayblast()') 

     cmds.showWindow(window) 

    @classmethod 
    def createPlayblast(cls): 

     cmds.playblast(f= "playblast", fmt= "image") 
     print "hallo" 

MyClass.createWindow() 

ich mein Modul wie das nenne:

# call loadTest 

import sys 
Dir = 'S:/people/Jan-Philipp/python_scripts' 
if Dir not in sys.path: 
sys.path.append(Dir) 
try: reload(loadTest) 
except: from loadTest import MyClass 

loadTest.MyClass() 

Cheers, hoffen, dass Sie alle haben einen schönen Tag!

Antwort

1

Wahrscheinlich möchten Sie MyClass.createWindow() aus dem Fenster entfernen und das dem aufrufenden Code überlassen. Wie geschrieben wird es jedes Mal ein Fenster erstellen, wenn Sie das Modul importieren. Es ist besser, nur Initialisierungscode in den Modulbereich zu legen.

Das Problem in diesem Fall ist, dass Sie versuchen, die Klasse aufzurufen, als ob es eine Funktion wäre. Wenn Sie nur Class wollen, würden Sie es tun wie dieses

import loadTest 

loadTest.MyClass.createWindow() 

In Python im Allgemeinen brauchen nicht zu tun wir Klassen machen, die nur Klassenmethoden haben: Ein Modul ist in der Regel, was Sie verwenden würde. In diesem Fall:

import maya.cmds as cmds 
from functools import partial 

def createWindow(): 

    windowID = 'window' 

    if cmds.window(windowID, exists = True): 
     cmds.deleteUI('window') 

    window = cmds.window(windowID, title="Blast", iconName='Blast', widthHeight=(400, 200)) 
    cmds.frameLayout(label='') 

    cmds.button(label='Playblast' ,command= createPlayblast) 

    cmds.showWindow(window) 

def createPlayblast(): 

    cmds.playblast(f= "playblast", fmt= "image") 
    print "hallo" 

und

import loadTest 
loadTest.createWindow() 

Ein Modul ist ein besseres Werkzeug für die Gruppierung bezogene Funktionen als eine Klasse. Klassen sind nur in Python sinnvoll, wenn die Klasse einige persistente Daten enthält.

+0

Isent diese Zeile in Ihrem Beitrag falsch in diesem Fall? cmds.button (Label = 'Playblast', Befehl = 'MyClass.createPlayblast()') wäre etwas wie: oder? cmds.button (Label = 'Playblast', Befehl = 'createPlayblast()') –

+0

Ja, das ist richtig. – theodox

+1

Verwenden Sie auch nicht die String-Referenzversion der Callbacks - übergeben Sie die Python-Funktionen direkt. Die Zeichenfolgenversionen funktionieren im Listener und im Produktionscode anders, sodass sie viele Fehler erzeugen. Siehe https://theodox.github.io/2014/maya_callbacks_cheat_sheet – theodox