如何在Maya中用Python刷新textScrollList并显示新增灯光?
解决Maya textScrollList不自动刷新灯光列表的问题
我来帮你搞定这个问题!你的核心问题是**textScrollList的创建逻辑错误**,而且没有设置列表更新的机制——原代码里每次点击“Make Lights”都会新建一个滚动列表,而不是更新已有的列表。下面给你两种可行的解决方案:
方案一:新增灯光时自动刷新列表
这种方式会在你创建灯光的同时,立刻把新灯光添加到滚动列表里,不需要手动操作。我们需要调整代码结构,把滚动列表的控件引用保存下来,然后在创建灯光后主动更新它:
import maya.cmds as cmds # 全局变量存储灯光列表和滚动列表控件 lights = [] light_selector = None def make_lights(*args): global lights, light_selector # 创建新的Arnold区域灯光 new_light = cmds.shadingNode('aiAreaLight', asLight=True) lights.append(new_light) # 直接更新已有的滚动列表,追加新灯光 cmds.textScrollList(light_selector, edit=True, append=new_light) def select_in_text_list(*args): # 获取滚动列表中选中的灯光,同步到Maya视图选择 selected_items = cmds.textScrollList(light_selector, query=True, selectItem=True) if selected_items: cmds.select(selected_items, replace=True) # 创建窗口和布局(只执行一次) my_window = cmds.window(title='My Lights', wh=(200,400), sizeable=False) cmds.columnLayout() # 创建按钮和滚动列表(滚动列表只初始化一次) cmds.button(label='Make Lights', command=make_lights, width=200, height=25, align='center') light_selector = cmds.textScrollList( numberOfRows=8, allowMultiSelection=True, append=lights, selectCommand=select_in_text_list ) cmds.showWindow(my_window)
关键改进点:
- 把
light_selector设为全局变量,让make_lights()能找到并编辑已有的滚动列表 - 用函数对象代替字符串作为按钮的
command参数(Maya会自动传递事件参数,所以函数要加*args) - 每次创建灯光后,用
edit=True模式调用textScrollList,直接追加新灯光条目
方案二:添加刷新按钮手动同步列表
如果你希望能手动控制列表刷新(比如处理手动删除灯光的情况),可以新增一个刷新按钮,点击时重新加载所有有效灯光:
import maya.cmds as cmds lights = [] light_selector = None def make_lights(*args): global lights new_light = cmds.shadingNode('aiAreaLight', asLight=True) lights.append(new_light) def refresh_list(*args): global lights, light_selector # 先清空现有列表 cmds.textScrollList(light_selector, edit=True, removeAll=True) # 过滤掉已被删除的无效灯光,避免列表出现失效条目 valid_lights = [light for light in lights if cmds.objExists(light)] # 重新加载有效灯光到列表 cmds.textScrollList(light_selector, edit=True, append=valid_lights) # 更新全局灯光列表为有效条目 lights = valid_lights def select_in_text_list(*args): selected_items = cmds.textScrollList(light_selector, query=True, selectItem=True) if selected_items: cmds.select(selected_items, replace=True) # 创建窗口和布局 my_window = cmds.window(title='My Lights', wh=(200,400), sizeable=False) cmds.columnLayout() # 创建功能按钮 cmds.button(label='Make Lights', command=make_lights, width=200, height=25, align='center') cmds.button(label='Refresh List', command=refresh_list, width=200, height=25, align='center') # 初始化滚动列表 light_selector = cmds.textScrollList( numberOfRows=8, allowMultiSelection=True, append=lights, selectCommand=select_in_text_list ) cmds.showWindow(my_window)
额外提示:
- 尽量避免用字符串作为
command参数,因为Maya会在全局命名空间查找函数,容易出现找不到函数的问题,直接传函数对象更可靠 - 如果需要监听用户手动删除灯光的操作,可以用Maya的
scriptJob功能,但会增加复杂度,小工具用手动刷新就足够了 - 对于大型工具,建议用类来封装灯光列表和控件,避免使用全局变量
内容的提问来源于stack exchange,提问作者Elscripter
相关产品推荐
相关产品推荐

