gpt4 book ai didi

python - 玛雅/Python : Creating Unique Commands in Loop-Generated UI

转载 作者:行者123 更新时间:2023-12-01 02:44:02 25 4
gpt4 key购买 nike

在 Autodesk Maya 中,我根据用户想要创建的楼层数动态创建 UI(变量 numFloors 从 intField 获取)。对于每个楼层,我想制作一个按钮来更改相机的高度以查看楼层(这是针对建筑物的)。我遇到的问题是我无法让 viewFloor() 函数知道按下了哪个按钮来激活它。每次,按钮都会经过最近的楼层,而不是特定的楼层。

我知道为什么会发生这种情况,创建按钮时该命令不是动态存储的,因此当单击按钮时,该命令使用变量的最新实例,该实例应该是最后一层,等于变量 numFloors。

for i in range(0, numFloors):
floor = i
btnName = 'floor'+str(floor)+'ViewBtn'
btnLabel = "view Floor " + str(floor)
btnCmdVar = str(floor)
cmds.button(btnName, label= btnLabel, w=20, h=20, command=lambda
arg:self.viewFloor(btnCmdVar))

def viewFloor(self, arg):
print "arg = " + str(arg)

因此,当 numFloors = 4 时,无论按下哪个楼层按钮,viewFloor 都将始终传递 4。就像我说的,我知道为什么会发生这种情况,这个代码片段只是我创建一个代码片段来传达我想要做的事情的最佳机会。不幸的是,我不知道如何实际实现这一点。

我的一些想法是:

一些复杂的 setattr 和 getattr 设置(但我不知道它是如何工作的)

或一个 scriptJob,它检测按钮何时被按下,并将该特定按钮的名称传递给 viewFloor 函数(然后我可以从字符串中提取数字来获取发言权)。但是,我在 Maya Python 文档中找不到按下按钮时发生的事件或条件的任何指示。因此,我无法创建 scriptJob。

如果有人能给我指出正确的方向(例如我可能需要的 scriptJob 标志或 setattr getattr 设置的示例)或任何其他解决方案,我太没有受过教育,甚至无法想象,我将非常感激。预先感谢您的帮助!

最佳答案

这是 lambda 工作方式的一个众所周知的问题:已记录为 here .

您可以通过几种方式解决这个问题:

使用functools.partial代替lambda

functools.partialfunctools 中的一个对象将可调用对象和参数绑定(bind)在一起的模块。您几乎可以像使用 lambda 一样使用它:

from functools import partial


for i in range(0, numFloors):
floor = i
btnName = 'floor'+str(floor)+'ViewBtn'
btnLabel = "view Floor " + str(floor)
cmd = partial(self.viewFloor, i)
cmds.button(btnName, label= btnLabel, w=20, h=20, command=cmd)

遵循函数

def make_button(n):
def callback (_):
self.showFloor(n)
return cmds.button( label = 'floor '+ str(n), command = callback)


for i in range(6):
make_button(i)

这里,嵌套函数 def 将以与您希望 lambda 相同的方式捕获值 - 但嵌套可以防止您遇到的问题

顺便说一句,无论哪种策略 self.showFloor 都需要一个额外的参数来容纳按钮始终触发的额外 bool 值。

关于python - 玛雅/Python : Creating Unique Commands in Loop-Generated UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45395690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com