Python 创建Maya UI

Python 创建Maya UI,python,maya,Python,Maya,我正在创建maya UI,但在maya中运行“替换名称”按钮一次后,尝试运行“加载对象”按钮命令两次时,出现以下错误: cmds.textFieldButtonGrp(self.loadobject, e=True, text=select_objects[0]) RuntimeError: 希望有人能帮我解决这个问题。 谢谢 您正在使用cmds,我强烈建议您改用pymel 将pymel.core导入为pm 但这不是你的问题 问题在于逻辑。 您有名为self.loadobject和self.b

我正在创建maya UI,但在maya中运行“替换名称”按钮一次后,尝试运行“加载对象”按钮命令两次时,出现以下错误:

cmds.textFieldButtonGrp(self.loadobject, e=True, text=select_objects[0])
RuntimeError:
希望有人能帮我解决这个问题。 谢谢


您正在使用cmds,我强烈建议您改用pymel 将pymel.core导入为pm 但这不是你的问题

问题在于逻辑。 您有名为self.loadobject和self.basename的类成员变量。这2个表示Maya UI对象的名称。执行查询时,将使用Maya UI对象的内容覆盖这些变量

然后,当您再次尝试使用这两个对象时,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)

另外,我还想使用partial命令

from functools import partial

[...]

cmds.textFieldButtonGrp(label="Basename",
                        buttonLabel="Rename",
                        text=self.basenameTEXT,
                        buttonCommand=partial(self.replace_name))
[...]
def load(self, *args):
[...]
在这种情况下,对你来说并没有太大的变化。 但是,如果你想通过一些变化,让你的生活更轻松

例如:


如前所述,问题在于代码的第33行和第35行。您正在使用其内容的查询字符串值覆盖textFieldButtonGrp对象。因此,当您再次返回并运行查询/编辑时,Maya会抛出错误,因为这两个变量不再包含textFieldButtonGrp的实例,它们现在是一个简单的字符串。只需将这两行更改为:

self.loadobject = ...
self.basename = ...
要创建本地化的:

loadobject = ...
basename = ...
或者,如果您需要在代码的其他部分中作为实例变量访问它们,只需使用不同的变量名,如Mathieu所述:

self.loadobjectText = ...
self.basenameText = ...

我认为,如果你想得到答案,你必须自己在这方面做更多的工作;Maya不是那么有名,目前任何想要帮助的人都必须摸索大量代码。不要说“Maya不是那么有名”!!!为什么推荐pymel而不是cmds?你从来没有说过任何原因。我很快想到一个原因:Pymel命令返回对象,cmds返回字符串。如果对象的名称更改,则变量不再有效。对于对象,名称无关紧要,您可以通过PyNode实例间接地直接访问MObject。面向对象编程比处理常量字符串操作更好。顺便说一句,这个问题是在2010年提出的,我在2012年回答了这个问题,以获得更高的声誉。现在,在2019年,我建议使用Qt ui,而不是使用Maya命令构建一个。我强烈建议使用shim,以确保您的UI在dccs、Maya版本甚至独立python安装之间兼容。不要预编译.ui文件。出于同样的原因动态加载它们。请参见获取MayaDockingClass.py。我们有自己的版本,允许我们在Mobu和python单机版中加载相同的.ui。
loadobject = ...
basename = ...
self.loadobjectText = ...
self.basenameText = ...