如何在Maya Python中为textScrollList添加图标及图标网格?
在Maya Python脚本中给textScrollList添加图标及实现图标网格
嘿,刚好做过类似的需求,来给你一步步拆解:
一、给textScrollList的列表项添加单个图标
Maya的textScrollList组件本身支持为每个列表项绑定图标,核心是用append(或insert)方法时指定image参数,或者通过edit模式下的itemImage来修改已存在项的图标。
代码示例:
import maya.cmds as cmds import os # 先清理可能存在的窗口 if cmds.window("iconScrollWin", exists=True): cmds.deleteUI("iconScrollWin") # 创建窗口 win = cmds.window("iconScrollWin", title="带图标的textScrollList", widthHeight=(300, 400)) cmds.columnLayout(adjustableColumn=True) # 创建textScrollList scroll_list = cmds.textScrollList(allowMultiSelection=False, width=280) # 准备图标路径(这里用Maya内置图标,也可以替换成自定义图标路径) # 获取Maya内置图标目录 icon_dir = cmds.internalVar(upd=True) + "icons/" icon_paths = [ os.path.join(icon_dir, "commandButton.xpm"), os.path.join(icon_dir, "renderButton.xpm"), os.path.join(icon_dir, "polyCube.xpm") ] # 给列表项添加图标 for idx, (label, icon) in enumerate(zip(["命令按钮", "渲染按钮", "多边形立方体"], icon_paths)): cmds.textScrollList(scroll_list, edit=True, append=label, itemImage=(idx+1, icon)) cmds.showWindow(win)
关键说明:
itemImage参数的格式是(项的索引, 图标路径),注意Maya的列表项索引是从1开始的- 图标支持
.xpm、.png等格式,自定义图标记得用绝对路径,避免路径问题 - 如果要动态更新某个项的图标,用
cmds.textScrollList(scroll_list, edit=True, itemImage=(item_index, new_icon_path))
二、给列表项实现图标网格布局
遗憾的是,textScrollList本身是垂直/水平的列表布局,没法直接实现网格。不过Maya提供了更适合做图标网格的组件——iconTextScrollList,它原生支持多列网格排列,完全能满足需求。
代码示例:
import maya.cmds as cmds import os # 清理旧窗口 if cmds.window("iconGridWin", exists=True): cmds.deleteUI("iconGridWin") # 创建窗口 win = cmds.window("iconGridWin", title="图标网格列表", widthHeight=(400, 400)) cmds.columnLayout(adjustableColumn=True) # 创建iconTextScrollList,设置为3列网格 grid_list = cmds.iconTextScrollList( numberOfColumns=3, columnWidth=100, imageAlignment="top", labelAlignment="bottom", allowMultiSelection=False, width=380 ) # 准备图标和标签 icon_dir = cmds.internalVar(upd=True) + "icons/" items = [ ("立方体", os.path.join(icon_dir, "polyCube.xpm")), ("球体", os.path.join(icon_dir, "polySphere.xpm")), ("圆柱体", os.path.join(icon_dir, "polyCylinder.xpm")), ("圆锥体", os.path.join(icon_dir, "polyCone.xpm")), ("平面", os.path.join(icon_dir, "polyPlane.xpm")), ("圆环", os.path.join(icon_dir, "polyTorus.xpm")) ] # 添加网格项 for label, icon in items: cmds.iconTextScrollList(grid_list, edit=True, append=label, image=icon) cmds.showWindow(win)
关键说明:
numberOfColumns用来指定网格的列数,Maya会自动按列排列项columnWidth可以设置每列的宽度,保证网格整齐imageAlignment和labelAlignment控制图标和文字的相对位置,适合调整布局美观度- 如果非要用
textScrollList实现网格,需要自定义绘制逻辑(比如用drawCommand),但复杂度很高,不推荐
额外小贴士:
- 图标尺寸尽量统一(比如24x24或32x32),避免拉伸变形
- 可以用
os.path.exists(icon_path)提前检查图标路径是否存在,避免显示空白 - 内置图标可以通过Maya的
图标浏览器(Window > General Editors > Icon Browser)查看和复制路径
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

