创建Maya界面
我正在创建一个Maya的用户界面,但是当我在Maya中先点击一次我的“替换名称”按钮后,再尝试点击“加载对象”按钮两次时,我遇到了这个错误:
cmds.textFieldButtonGrp(self.loadobject, e=True, text=select_objects[0])
RuntimeError:
希望有人能帮我解决这个问题。谢谢。
import maya.cmds as cmds
class MyUI:
def __init__(self):
self.title = "Test UI"
self.window = cmds.window(self.title, widthHeight=(1000, 600),
resizeToFitChildren=1)
cmds.rowLayout("button1, button2, button3", numberOfColumns=5)
cmds.columnLayout(adjustableColumn=True, columnAlign="center",
rowSpacing=10)
self.loadobject = cmds.textFieldButtonGrp(label="Load Object name",
buttonLabel="Load",
text="Select Object %s."
% "and Load name",
buttonCommand=self.load)
self.basename = cmds.textFieldButtonGrp(label="Basename",
buttonLabel="Rename",
text="Enter basename.",
buttonCommand=self.replace_name)
cmds.setParent(menu=True)
cmds.showWindow(self.window)
def load(self, *args):
select_objects = cmds.ls(selection=True)
cmds.textFieldButtonGrp(self.loadobject, e=True, text=select_objects[0])
def replace_name(self, *args):
self.loadobject = cmds.textFieldButtonGrp(self.loadobject,
q=True, text=True)
self.basename = cmds.textFieldButtonGrp(self.basename,
q=True, text=True)
name = cmds.rename(self.loadobject, self.basename)
ctlname = "%s_ctl" % name
self.new_name = cmds.rename(name, ctlname)
3 个回答
0
如前所述,问题出在你代码的第33行和第35行。你把textFieldButtonGrp对象的内容用查询到的字符串值覆盖了。所以当你第二次运行查询/编辑时,Maya就会报错,因为这两个变量不再是textFieldButtonGrp的实例,而变成了简单的字符串。只需将这两行代码从:
self.loadobject = ...
self.basename = ...
改为本地化的:
loadobject = ...
basename = ...
或者,如果你需要在代码的其他部分作为实例变量访问它们,正如Mathieu所解释的,你只需使用不同的变量名:
self.loadobjectText = ...
self.basenameText = ...
1
另外,我建议在命令中使用部分参数。
from functools import partial
[...]
cmds.textFieldButtonGrp(label="Basename",
buttonLabel="Rename",
text=self.basenameTEXT,
buttonCommand=partial(self.replace_name))
[...]
def load(self, *args):
[...]
在这种情况下,对你来说其实没什么太大变化。 但是如果你想传递一些变量,使用部分参数会让你的生活更轻松哦;)
比如:
[...]
cmds.textFieldButtonGrp(label="Basename",
buttonLabel="Rename",
text=self.basenameTEXT,
buttonCommand=partial(self.replace_name, obj))
[...]
def load(self, obj, *args):
[...]
7
你现在使用的命令我强烈推荐用pymel来替代。
import pymel.core as pm
不过这并不是你遇到的问题所在。
问题出在逻辑上。
你有两个类成员变量,叫做 self.loadobject
和 self.basename
。这两个变量代表了Maya界面对象的名称。当你进行查询时,你把这两个变量的值覆盖成了Maya界面对象的内容。
然后当你再次尝试使用这两个对象时,Maya会告诉你:
运行时错误: "兄弟,你在说谁啊?"
我为Autodesk的朋友们感到抱歉,他们可能因为粗俗的语言而审查了第二行,或者干脆没有在Maya中提供一个有用的调试工具。
import maya.cmds as cmds
#x=MyUI()
class MyUI:
def __init__(self):
self.title = "Test UI"
self.window = cmds.window(self.title, widthHeight=(1000, 600),
resizeToFitChildren=1)
cmds.rowLayout("button1, button2, button3", numberOfColumns=5)
cmds.columnLayout(adjustableColumn=True, columnAlign="center",
rowSpacing=10)
self.loadobjectTEXT = "Select Object and Load name"
self.loadobjectFIELDNAME = cmds.textFieldButtonGrp(label="Load Object name",
buttonLabel="Load",
text=self.loadobjectTEXT,
buttonCommand=self.load)
self.basenameTEXT = "Enter basename."
self.basenameFIELDNAME = cmds.textFieldButtonGrp(label="Basename",
buttonLabel="Rename",
text=self.basenameTEXT,
buttonCommand=self.replace_name)
cmds.setParent(menu=True)
cmds.showWindow(self.window)
def load(self):
select_objects = cmds.ls(selection=True)
cmds.textFieldButtonGrp(self.loadobjectFIELDNAME, e=True, text=select_objects[0])
def replace_name(self, *args):
self.loadobjectTEXT = cmds.textFieldButtonGrp(self.loadobjectFIELDNAME,
q=True, text=True)
self.basenameTEXT = cmds.textFieldButtonGrp(self.basenameFIELDNAME,
q=True, text=True)
name = cmds.rename(self.loadobjectTEXT, self.basenameTEXT)
ctlname = "%s_ctl" % name
self.new_name = cmds.rename(name, ctlname)