-2

我所要做的就是向字典中添加更多项目,并在必要时使用第二个按钮填充!!!一切顺利,通过单击蓝色播放按钮从 Maya 脚本编辑器运行代码,但如果我导入此脚本 import funtest funtest.main()

窗口加载正常,但单击任一按钮时出现错误...所以请告诉我为什么它们在从脚本编辑器执行代码和通过导入执行另一个代码之间有区别..

它应该是一样的,或者我的逻辑有什么问题?

import maya.cmds as cmds
dic={}
print("dictionary is empty",dic)
def main():
    inst=btnUI()
    inst.create()


class btnUI(object):
    def __init__(self, winName="winTheWindow"):
        self.winTitle = "The Window"
        self.winName = winName

    def create(self):
        if cmds.window(self.winName, exists=True):
            cmds.deleteUI(self.winName)
        dic['item1']='item1value'
        dic['item2']='item2value'

        cmds.window(self.winName, title=self.winTitle)
        self.mainCol = cmds.columnLayout( adjustableColumn=True )
        self.btnA = cmds.button( label='Press Me - External Func',c='outsideFunc(dic)' )
        self.btnb = cmds.button( label='Populate more items',c='populateDic()' )
        cmds.showWindow( self.winName )
        cmds.window(self.winName, edit=True, widthHeight=[250,75])



def populateDic():
    dic['item3']='item3value'
    dic['item4']='item4value'
    dic['item5']='item5value'

def outsideFunc(dicItems):
    print("Outside function, called from inside a class function")
    print(dicItems)

if __name__ == '__main__':
    main()
4

1 回答 1

0

这是因为您的c参数解析cmds.button()发生在另一个命名空间中。似乎有几种方法可以解决它,但我建议遵循更 Pythonic 的方法:

from functools import partial
self.btnA = cmds.button( label='Press Me - External Func',
                         c=partial(outsideFunc, dic))
self.btnb = cmds.button( label='Populate more items',c=populateDic)

对于按钮 A,我partial用来帮助传递dicoutsideFunc,因此由 partial 生成的结果函数不需要任何参数(它已预先加载了dic参数)。

对于按钮 B,这是不必要的,因为它不需要任何参数。所以我们只是给它一个要调用的函数的名称。请注意缺少引号。Python 将在正确的命名空间中解决此问题,并按预期工作。

顺便说一句,这个页面似乎很有帮助,并讨论了命令回调:http ://www.luma-pictures.com/tools/pymel/docs/1.0/ui.html

更新:按钮将参数传递给它们的回调,因此您需要包装它:

from functools import partial
self.btnA = cmds.button( label='Press Me - External Func',
                         c=lambda arg: outsideFunc(dic))
self.btnb = cmds.button( label='Populate more items',c=lambda arg: populateDic())

这会创建几个匿名函数来丢弃参数(因为您不需要它)。

于 2012-09-15T10:50:09.223 回答