我正在通过脚本创建一个装备,我有一个UI。我想将多个功能连接到一个按钮。或者更确切地说,在函数内部有一个函数。关于如何解决这个问题的任何建议?
我正在导入以下库:
import maya.cmds as cmds
from functools import partial
答案 0 :(得分:0)
你能用一个小例子进一步解释你的做法吗?
我看到你想使用partial,所以你可能有多个变量要通过?
我的第一个想法是创建一个对多重函数进行分组的函数,即:
def temp01():
return cmds.ls(sl=True)
def connection(obj01, obj02):
someCommand(obj01, obj02)
def printor():
print('yeah it is working')
def uiCommandButton_whatShouldIDoFunc(obj02, specialOkay, *args):
someCommand(temp01(), obj02)
specialOkay() #should print message
button01 = cmds.button(c=partial( uiCommandButton_whatShouldIDoFunc, cmds.ls(sl=1)[-1]), printor )
答案 1 :(得分:0)
为了让事情变得干净整洁,我会使用处理程序。
处理程序是在GUI元素上发生事件时调用的方法,如单击。在处理程序中,您可以执行任何操作(例如调用两个函数)。处理程序/事件处理程序是一种久经考验的GUI编程技术。
以下是一个例子:
my_button = cmds.button(command=partial(my_button_on_click_handler, arg1, arg2))
def my_button_on_click_handler(arg1, arg2):
# call all your functions and do stuff here
my_other_func1(arg1)
my_other_func2(arg2)
关于这个主题的一些很棒的帖子(礼貌:@theodox和他很棒的博客): http://techartsurvival.blogspot.ca/2014/04/maya-callbacks-cheat-sheet.html?m=1
http://techartsurvival.blogspot.ca/2014/04/the-main-event-event-oriented.html?m=1
答案 2 :(得分:0)
使用PyMel和PySide / Qt有一种“脏”方式。
首先,将按钮变为Pymel按钮:
import pymel.core as pm
import pymel.core.uitypes as pui
pyBtn = pm.button(label="", etc...)
or
pyBtn = pui.PyUI(my_button)
然后,将其转换为QtObject:
qtBtn = pyBtn.asQtObject()
最后,您可以在单击按钮时添加功能:
qtBtn.clicked.connect(func1)
qtBtn.clicked.connect(partial(func2, arg1))
etc...
但就像我说的那样,这并不是真的推荐......这只是另一种方式。 我认为分享它可能会很有趣。 例如,如果UI已存在,则可以使用此解决方案,但无法访问创建它的代码。
否则,我会在其他答案中建议,创建处理程序函数。
PS:这只适用于maya2014及以上,或安装了PyQt的maya!