Maya 的 textField 仅支持单行显示,无法正确渲染换行符;要实现顶点列表等多行、可滚动的清晰展示,应改用 scrollField 控件,并配合 \n 拼接内容一次性写入。
maya 的 `textfield` 仅支持单行显示,无法正确渲染换行符;要实现顶点列表等多行、可滚动的清晰展示,应改用 `scrollfield` 控件,并配合 `\n` 拼接内容一次性写入。
在 Maya Python UI 开发中,常有需求将选中的顶点、面或对象列表以易读格式展示在界面中——例如每个顶点坐标独占一行。但若直接使用 cmds.textField 并尝试通过 insertText 循环追加带 \n 的字符串,结果往往失败:文本框仍显示为拥挤的单行,换行符被忽略。这是因为 textField 的底层设计仅支持单行输入/显示,其 insertText 行为会覆盖或挤压内容,且不解析换行控制符。
正确的解决方案是切换至专为多行场景设计的控件:scrollField。它原生支持 \n 换行、自动换行(wordWrap=True 可选)、垂直滚动条,并允许设为只读(editable=False),完美契合信息展示类需求。
以下是修正后的完整示例代码(含关键注释):
import maya.cmds as cmds
window_name = "vertexDisplayWindow"
def get_selected_vertices():
# 获取展平后的顶点选择(如 pSphere1.vtx[0], pSphere1.vtx[1]...)
selected_vertices = cmds.ls(selection=True, flatten=True, type="meshVtx")
if not selected_vertices:
return []
# 获取每个顶点的世界坐标(返回 [x,y,z] 列表)
vertex_positions = []
for vertex in selected_vertices:
try:
pos = cmds.pointPosition(vertex, world=True)
vertex_positions.append(f"{vertex}: ({pos[0]:.3f}, {pos[1]:.3f}, {pos[2]:.3f})")
except RuntimeError:
vertex_positions.append(f"{vertex}: (invalid)")
return vertex_positions
def display_selected_verts(*args):
# 获取顶点数据
vertex_positions = get_selected_vertices()
# 构建多行字符串(每行一个顶点,含坐标)
display_text = "\n".join(vertex_positions) if vertex_positions else "No vertices selected."
# 【关键修改】使用 scrollField 替代 textField,并一次性设置 text 属性
cmds.scrollField("vertexScrollField", edit=True, text=display_text)
def create_ui():
# 删除已存在的同名窗口(避免重复创建)
if cmds.window(window_name, exists=True):
cmds.deleteUI(window_name)
cmds.window(window_name, title="Selected Vertices Display", widthHeight=(400, 300))
cmds.columnLayout(adjustableColumn=True, rowSpacing=8, columnPadding=(10, 10))
cmds.text(label="Selected Vertices (World Position):", align="left", font="boldLabelFont")
# 【核心替换】使用 scrollField,启用滚动与多行
cmds.scrollField(
"vertexScrollField",
editable=False,
height=160,
width=380,
wordWrap=False, # 关闭自动折行,保持坐标对齐
statusBarMessage="Read-only display of vertex positions"
)
cmds.button(
label="Refresh Selection",
command=display_selected_verts,
backgroundColor=[0.25, 0.35, 0.5]
)
cmds.showWindow()
# 创建并显示界面
create_ui()
注意事项与最佳实践:
- ✅ 必须用 text= 参数一次性赋值:scrollField 不支持 insertText 追加(该命令在 scrollField 上无效),需拼接完整字符串后调用 edit=True, text="..."。
- ✅ 显式处理空选择:避免 None 或空列表导致 UI 显示异常。
- ⚠️ 禁用 wordWrap 以保障坐标可读性:顶点坐标含小数,开启自动折行可能破坏数值对齐,影响排查。
- ? scrollField 默认可编辑:务必设置 editable=False 防止用户误改,符合“只读展示”定位。
- ? 扩展建议:如需高亮、复制或导出功能,可进一步封装为 scriptedPanel 或集成 Qt(PySide2/6),但对轻量工具,scrollField 已足够稳健高效。
通过这一替换,你的 Maya 工具将立刻拥有专业级的多行数据显示能力——既“功能可靠”,又真正“赏心悦目”。










