Maya Python 脚本在控制台中有效,在文件中无效

Maya Python Script works from console, doesnt work from file

import maya.cmds as cmds

#Function
def printTxtField(fieldID):
    print cmds.textField(fieldID, query=True, text=True)

#define ID string for Window
winID = 'myWindow'

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

cmds.window(winID)
cmds.columnLayout()
whatUSay = cmds.textField()
cmds.button(label='Click me', command='printTxtField(whatUSay)')
cmds.showWindow()

当我从 Maya 的控制台执行它时,它工作正常。但是当我将它另存为文件并执行时,我收到此错误消息:

# Error: Object 'myWindow|columnLayout30|textField29' not found.
# Traceback (most recent call last):
#   File "<maya console>", line 1, in <module>
#   File "<maya console>", line 5, in printTxtField
# RuntimeError: Object 'myWindow|columnLayout30|textField29' not found. #

我注意到 columnLayout30|textField29 中的数字增加,每次我从控制台执行脚本,然后再次从文件执行,我觉得很困惑,因为旧的 window 每次都被删除.

我发现了这个问题: super function doesn't work inside a maya python module
但我不确定这是否是同一个问题。
我正在使用 IDLE 3.6.4 和 Maya 2016 SP6

(我是一个孤独的艺术家,正在尝试编写脚本。(python/maya和C#/unity)我想说的是,学习编码部分真的没有那么难。它可能很乏味有时,但你几乎可以 google 完成任何事情。但它的 "setting up" 部分几乎总是让我感到困惑。安装 IDE 和库以及 "connecting" 东西。在这里我遇到了所有错误时间。所以任何关于我在这里遗漏的一般帮助,将不胜感激)

我不喜欢使用基于文本的命令。相反,您可以分配回调。 一种尝试方法是使用 lambda(因为您想传递自己的参数):

cmds.button(label='Click me', command=lambda x:printTxtField(whatUSay))

Lambda 应该可以工作,但如果您想要更清楚的东西,请使用部分:

import maya.cmds as cmds
from functools import partial

#Function
# Don't forgot the *args because maya is putting one default last arg in -c flags
def printTxtField(fieldID, *args):
    print cmds.textField(fieldID, query=True, text=True)

#define ID string for Window
winID = 'myWindow'

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

cmds.window(winID)
cmds.columnLayout()
whatUSay = cmds.textField()
# syntax :: partial(function, argument1, argument2, ...etc)
cmds.button(label='Click me', command=partial(printTxtField, whatUSay))
cmds.showWindow()