Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不使Maya崩溃的情况下运行OpenMaya.MCommandMessage_Python_Maya_Maya Api - Fatal编程技术网

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

Python 如何在不使Maya崩溃的情况下运行OpenMaya.MCommandMessage,python,maya,maya-api,Python,Maya,Maya Api,我正在尝试获取Maya的日志(它在脚本编辑器的输出窗口中打印的内容),并将其添加到我的自定义PySide Qwidget中。 为什么这会让玛雅崩溃 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

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

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()
但事实并非如此

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

OM.MCommandMessage.addCommandOutputFilterCallback(callback)
下面是部分工作的工作代码。它应该将日志信息附加到“QtextEdit()”中,但在第一次操作后Maya崩溃(例如创建球体)

这一个不会破坏玛雅

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)

您尚未显示第一个示例的完整代码

当启动回调但原始对象已被销毁时,就会发生这些崩溃

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

您尚未显示第一个示例的完整代码

当启动回调但原始对象已被销毁时,就会发生这些崩溃

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

关闭窗口时需要删除回调。我在测试你的代码,第一次它就工作了,但是后来的时间冻结了Maya

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所说,崩溃的发生是因为对象被破坏了,这是在你关闭窗口时发生的。因此,在此之前,您需要删除回调。

您需要在关闭窗口时删除回调。我在测试你的代码,第一次它就工作了,但是后来的时间冻结了Maya

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所说,崩溃的发生是因为对象被破坏了,这是在你关闭窗口时发生的。所以在此之前,您需要删除回调。

很抱歉,我不能发布完整的代码,但我添加了一些行来显示代码的一般用途。我有需要更新的UI。如何避免垃圾收集?很抱歉,即使您在问题中添加了一些代码,我仍然不知道您在哪里创建了
UiClass
对象。很抱歉,这被误解了。我已经添加了这些行。首先,我导入模块。然后我创建了这个对象,并用
show()
调用它。很抱歉,我不能发布整个代码,但我添加了一些行来显示代码的一般用途。我有需要更新的UI。如何避免垃圾收集?很抱歉,即使您在问题中添加了一些代码,我仍然不知道您在哪里创建了
UiClass
对象。很抱歉,这被误解了。我已经添加了这些行。首先,我导入模块。然后我创建了对象,并使用
show()
调用它,感谢它部分解决了问题。现在,在执行生成消息的某些操作后,它会使Maya崩溃。例如,在视口中创建定位器或选择一些节点。@iRex可能是上一个窗口,该窗口已被破坏,但仍订阅了回调。@ababak如果我只调用一次,怎么可能?谢谢,它部分解决了问题,现在在您执行生成消息的某些操作后,它会使Maya崩溃。例如,在视口中创建定位器或选择一些节点。@iRex可能是上一个窗口,该窗口已被破坏,但仍订阅了回调。@ababak如果我只调用一次,怎么可能?