Как запустить OpenMaya.MCommandMessage без сбоя Maya - PullRequest
1 голос
/ 04 апреля 2020

Я пытаюсь получить журнал Maya (что он печатает в окне вывода редактора сценариев) и добавить его в свой собственный PySide Qwidget. Почему это дает сбой Maya

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 )

        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

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)

Ответы [ 2 ]

3 голосов
/ 05 апреля 2020

Вам необходимо удалить обратный вызов при закрытии окна. Я тестировал ваш код, и он работал в первый раз, но в последующие времена 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, сбой происходит из-за того, что объект был уничтожен, что происходит при закрытии окна. Поэтому, прежде чем это произойдет, вам нужно удалить обратный вызов.

2 голосов
/ 05 апреля 2020

Вы не показали полный код первого примера.

Эти сбои происходят, когда выполняется обратный вызов, но исходный объект уже был уничтожен.

Я предполагаю, что вы создали объект UiClass, но позже это сборщик мусора. Во втором примере не выполняется sh, поскольку вы определяете функцию обратного вызова в глобальной области видимости, и он остается действительным до тех пор, пока вы не закроете Maya.

...