首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不使OpenMaya.MCommandMessage崩溃的情况下运行Maya

如何在不使OpenMaya.MCommandMessage崩溃的情况下运行Maya
EN

Stack Overflow用户
提问于 2020-04-04 23:58:05
回答 2查看 160关注 0票数 1

我正在尝试获取Maya的日志(它在脚本编辑器的输出窗口中打印的内容),并将其添加到我的自定义PySide Qwidget中。为什么这会导致Maya崩溃

代码语言:javascript
运行
复制
QtWidgets, QtCore, QtGui
imoprt QtDesiner_UI
import maya.OpenMayaUI as OmUi
from shiboken2 import wrapInstance
import maya.OpenMaya as Om

def get_maya_window():
    # Get Maya window
    maya_main_window_ptr = OMUI.MQtUtil.mainWindow()

    maya_main_window = wrapInstance(long(maya_main_window_ptr), 
    QtWidgets.QMainWindow)

    return maya_main_window

class UiClass(QtWidgets.QMainWindow, QtDesiner_UI.MainWindow):

    def __init__(self):
        super(UiClass, self).__init__(get_maya_window())

        OM.MCommandMessage.addCommandOutputFilterCallback(self.callback)
        # some PySide Widgets here
        self.console_widget = QtWidgets.QTextEdit()
        self.main_form_layout.addRow(self.console_widget)

    def callback(self, msg, mg, *args):
       self.console_widget.append(msg)

    def logic_stuff(self):
        #maya commands here

import UI_Window
w = UI_Window.UiClass()
w.show()

但这并不是

代码语言:javascript
运行
复制
def callback(msg, mg ,*args):
    console_widget.append(var)

OM.MCommandMessage.addCommandOutputFilterCallback(callback)

以下是部分工作的工作代码。它应该将日志信息附加到'QtextEdit()‘中,但在第一次操作后,Maya崩溃(例如创建球体)。

代码语言:javascript
运行
复制
import maya.OpenMayaUI as OmUi
from shiboken2 import wrapInstance
from PySide2 import QtWidgets, QtCore, QtGui
import maya.OpenMaya as Om

def get_maya_window():
    # Get Maya window
    maya_main_window_ptr = OmUi.MQtUtil.mainWindow()
    maya_main_window = wrapInstance(long(maya_main_window_ptr), QtWidgets.QMainWindow)
    return maya_main_window

class MainWidget(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWidget, self).__init__(get_maya_window())

        self.cent_ly = MW()
        self.text_edit = QtWidgets.QTextEdit()
        self.cent_ly.vlayout.addWidget(self.text_edit )
        self.setCentralWidget(self.cent_ly )

        self.callback_id = Om.MCommandMessage.addCommandOutputFilterCallback(self.callback)

    def closeEvent(self, event):
        Om.MMessage.removeCallback(self.callback_id)

    def callback(self, message):
        self.text_edit.append(message.strip())

class MW(QtWidgets.QWidget):
    def __init__(self):
        super(MW , self).__init__()
        self.vlayout = QtWidgets.QVBoxLayout()        
        self.setLayout(self.vlayout)

w = MainWidget()
w.show()

这个可以在不影响Maya的情况下工作

代码语言:javascript
运行
复制
import maya.OpenMayaUI as OmUi
from shiboken2 import wrapInstance
from PySide2 import QtWidgets, QtCore, QtGui
import maya.OpenMaya as Om

def get_maya_window():
    # Get Maya window
    maya_main_window_ptr = OmUi.MQtUtil.mainWindow()
    maya_main_window = wrapInstance(long(maya_main_window_ptr), QtWidgets.QMainWindow)
    return maya_main_window

class MainWidget(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWidget, self).__init__(get_maya_window())

        self.cent_ly = MW()
        self.text_edit = QtWidgets.QTextEdit()
        self.cent_ly.vlayout.addWidget(self.text_edit)
        self.setCentralWidget(self.cent_ly )

class MW(QtWidgets.QWidget):
    def __init__(self):
        super(MW , self).__init__()
        self.vlayout = QtWidgets.QVBoxLayout()        
        self.setLayout(self.vlayout)

w = MainWidget()
w.show()

def callback(message,  *args):
    w.text_edit.append(message.strip())

callback_id = Om.MCommandMessage.addCommandOutputFilterCallback(callback)

# Om.MMessage.removeCallback(callback_id)
EN

回答 2

Stack Overflow用户

发布于 2020-04-05 22:29:58

关闭窗口时需要移除回调。我正在测试你的代码,它第一次工作,但随后的几次冻结了Maya。

代码语言:javascript
运行
复制
class UiClass(QtWidgets.QMainWindow):
    def __init__(self):
        super(UiClass, self).__init__(get_maya_window())
        self.callback_id = Om.MCommandMessage.addCommandOutputFilterCallback(self.callback)

    def closeEvent(self, event):
        Om.MMessage.removeCallback(self.callback_id)

正如@ababak所说,崩溃发生是因为对象被销毁了,当你关闭窗口时就会发生这种情况。因此,在此之前,您需要删除回调。

票数 3
EN

Stack Overflow用户

发布于 2020-04-05 18:26:57

您还没有展示第一个示例的完整代码。

当回调被激活,但原始对象已经被销毁时,这些崩溃就会发生。

我假设您创建了UiClass对象,但后来它被垃圾回收了。当您在全局范围内定义回调函数时,第二个示例不会崩溃,并且它将保持有效,直到您退出Maya。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61030773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档