You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PySide2和Python设置Maya导出文件路径

解决Maya PySide工具的导出路径保存问题

核心思路是通过类属性存储选中的文件夹路径,同时将路径同步到输入框,让其他导出按钮可以直接调用这个属性:

  1. 添加UI元素:包含用于显示路径的QLineEdit和选择文件夹的QPushButton
  2. 绑定槽函数:给"Set Export Folder"按钮绑定文件夹选择逻辑,更新输入框和类属性
  3. 复用路径:导出按钮的逻辑直接读取类中存储的路径

以下是修改后的完整代码示例(基于PySide2,适配Maya环境):

import maya.cmds as cmds
from PySide2 import QtWidgets, QtCore

class MayaFBXExporter(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(MayaFBXExporter, self).__init__(parent)
        self.setWindowTitle("FBX Exporter Tool")
        self.resize(400, 150)
        
        # 初始化导出路径属性,默认空
        self.export_folder = ""
        
        self._build_ui()
        self._connect_signals()
        
    def _build_ui(self):
        main_layout = QtWidgets.QVBoxLayout(self)
        
        # 路径选择区域
        path_layout = QtWidgets.QHBoxLayout()
        
        # 输入框:显示选中的路径
        self.path_input = QtWidgets.QLineEdit()
        self.path_input.setReadOnly(True)  # 设置为只读,避免手动修改
        path_layout.addWidget(self.path_input)
        
        # 选择文件夹按钮
        self.set_folder_btn = QtWidgets.QPushButton("Set Export Folder")
        path_layout.addWidget(self.set_folder_btn)
        
        main_layout.addLayout(path_layout)
        
        # 导出按钮区域
        export_layout = QtWidgets.QHBoxLayout()
        
        self.export_anim_btn = QtWidgets.QPushButton("Export FBX Animation")
        export_layout.addWidget(self.export_anim_btn)
        
        self.export_rig_btn = QtWidgets.QPushButton("Export RIG")
        export_layout.addWidget(self.export_rig_btn)
        
        main_layout.addLayout(export_layout)
        
    def _connect_signals(self):
        # 绑定文件夹选择按钮的槽函数
        self.set_folder_btn.clicked.connect(self._select_export_folder)
        # 绑定导出按钮的槽函数
        self.export_anim_btn.clicked.connect(self._export_fbx_animation)
        self.export_rig_btn.clicked.connect(self._export_rig)
        
    def _select_export_folder(self):
        # 弹出文件夹选择对话框
        folder_path = QtWidgets.QFileDialog.getExistingDirectory(
            self, 
            "Select Export Folder", 
            "",  # 默认打开路径,可根据需求修改
            QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontResolveSymlinks
        )
        
        if folder_path:
            # 更新输入框显示
            self.path_input.setText(folder_path)
            # 保存路径到类属性,供其他按钮使用
            self.export_folder = folder_path
            
    def _export_fbx_animation(self):
        # 检查路径是否已选择
        if not self.export_folder:
            cmds.warning("Please select an export folder first!")
            return
            
        # 这里放入你已有的动画导出逻辑,使用self.export_folder作为路径
        anim_export_path = f"{self.export_folder}/animation.fbx"
        # 示例导出命令(替换成你的实际代码)
        cmds.file(anim_export_path, force=True, options="v=0;", typ="FBX export", pr=True, es=True)
        cmds.info(f"Animation exported to: {anim_export_path}")
        
    def _export_rig(self):
        # 检查路径是否已选择
        if not self.export_folder:
            cmds.warning("Please select an export folder first!")
            return
            
        # 这里放入你已有的RIG导出逻辑,使用self.export_folder作为路径
        rig_export_path = f"{self.export_folder}/rig.fbx"
        # 示例导出命令(替换成你的实际代码)
        cmds.file(rig_export_path, force=True, options="v=0;", typ="FBX export", pr=True, es=True)
        cmds.info(f"RIG exported to: {rig_export_path}")

# 启动工具
if __name__ == "__main__":
    # 避免重复创建窗口
    try:
        exporter_dialog.close()
        exporter_dialog.deleteLater()
    except:
        pass
        
    exporter_dialog = MayaFBXExporter()
    exporter_dialog.show()

关键说明:

  • self.export_folder:作为类的实例属性,存储选中的文件夹路径,整个类的方法都可以直接访问
  • _select_export_folder:处理文件夹选择逻辑,选中路径后同时更新输入框和类属性
  • 导出方法中的路径检查:在执行导出前先判断路径是否为空,避免报错
  • QLineEdit设置为只读:防止用户手动修改路径,确保路径来源唯一

内容的提问来源于stack exchange,提问作者Valeriya Fedoseeva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:50:22