Отображение исключений справа от командной строки для обратных вызовов/слотов PyQt/PySide в Autodesk Maya

Обновлено: стало намного понятнее.

В следующих фрагментах кода, использующих виджеты Maya через pymel, справа от командной строки есть выделение ошибки.

import pymel.core as pm

def raiseError():
    pm.select("ooxx") # ooxx doesn't exist
    print "Something after the exception."

class pymelWindow(object):
    def __init__(self):
        self.mainWin = pm.window("test")
        with self.mainWin:
            mainForm = pm.formLayout()
            with mainForm:
                btn = pm.button(label='show error',command=pm.Callback(raiseError))
            mainForm.redistribute()

    def show(self):
        self.mainWin.show()

win = pymelWindow()
win.show()

Здесь прикреплен снимок Maya 2011 (такая же проблема в Maya 2014) с выделением ошибки (красным).

Maya с подсветкой ошибок справа от командной строки.

и вот трассировка стека:

# Error: Maya Node does not exist: u'ooxx'
# Traceback (most recent call last):
#   File "/usr/autodesk/maya2014-x64/lib/python2.7/site-packages/pymel/internal/factories.py", line 778, in callback
#     res = origCallback( *newargs )
#   File "/usr/autodesk/maya2014-x64/lib/python2.7/site-packages/pymel/internal/factories.py", line 701, in __call__
#     return self.func(*self.args, **self.kwargs)
#   File "/dept/rdworks/drake/Desktop/pyqt_issues/testPyQtSpitError.py", line 119, in raiseError
#     pm.select("ooxx")
#   File "/usr/autodesk/maya2014-x64/lib/python2.7/site-packages/pymel/core/general.py", line 151, in select
#     raise TypeError, msg
# MayaNodeError: Maya Node does not exist: u'ooxx' # 

Однако, когда я переключаюсь на использование PyQt/PySide для виджетов со следующими фрагментами кода, справа от командной строки не появляется никакого видимого выделения ошибок! Кто-нибудь знает, как заставить версию PyQt/PySide иметь такое же поведение графического интерфейса?

import pymel.core as pm
from PyQt4 import QtGui

def raiseError():
    pm.select("ooxx") # ooxx doesn't exist
    print "Something after the exception."

class pyQtWindow(QtGui.QMainWindow):
    def __init__(self, parent = None):
        # init our ui using the MayaWindow as parent
        super(pyQtWindow, self).__init__(parent)

        self.centralWidget = QtGui.QWidget(self)
        self.setCentralWidget(self.centralWidget)
        self.centralLayout = QtGui.QVBoxLayout()
        self.centralWidget.setLayout(self.centralLayout)

        self.errorBtn = QtGui.QPushButton('show error')
        self.errorBtn.clicked.connect(raiseError)
        self.centralLayout.addWidget(self.errorBtn)

win = pyQtWindow()
win.show()

Maya без выделения ошибок справа от командной строки!

# Traceback (most recent call last):
#   File "/usr/autodesk/maya2014-x64/lib/python2.7/site-packages/pymel/internal/factories.py", line 701, in __call__
#     return self.func(*self.args, **self.kwargs)
#   File "/dept/rdworks/drake/Desktop/pyqt_issues/testPyQtSpitError.py", line 119, in raiseError
#     pm.select("ooxx")
#   File "/usr/autodesk/maya2014-x64/lib/python2.7/site-packages/pymel/core/general.py", line 151, in select
#     raise TypeError, msg
# pymel.core.general.MayaNodeError: Maya Node does not exist: u'ooxx'

person Drake Guan    schedule 04.12.2013    source источник
comment
По выделению ошибки в отображении строки вы открываете окно вывода в редакторе скриптов Maya?   -  person Bleeding Fingers    schedule 07.12.2013
comment
Печатается ли Something after the exception. при использовании блока кода PyQt/PySide?   -  person Bleeding Fingers    schedule 07.12.2013
comment
@BleedingFingers Я уверен, что после исключения ничего не напечатано. Тестирование просто в вопросе без каких-либо дополнительных вещей.   -  person Drake Guan    schedule 09.12.2013
comment
@BleedingFingers Я также сделал снимок, чтобы прояснить вопрос. Спасибо за предложение.   -  person Drake Guan    schedule 09.12.2013
comment
Вы включили опцию Show Stack Trace в редакторе скриптов? Правка-›Показать трассировку стека   -  person Bleeding Fingers    schedule 09.12.2013
comment
@BleedingFingers Конечно, та же ситуация.   -  person Drake Guan    schedule 09.12.2013
comment
Просто обновите описание и изображения, чтобы сделать их более понятными.   -  person Drake Guan    schedule 17.12.2013
comment
Добавьте полную трассировку стека, полученную из обоих кодов в текстовых формах. Это очень поможет будущему пользователю найти вопрос.   -  person Bleeding Fingers    schedule 20.12.2013
comment
Если я не ошибаюсь, вы используете Maya 2011 вместо 2014, о которой вы упоминаете.   -  person Bleeding Fingers    schedule 20.12.2013
comment
Я разрабатываю под Maya2014.   -  person Drake Guan    schedule 23.12.2013
comment
Ваша трассировка говорит /usr/bin/maya2011-x64/..., если вы не установили Maya2014 в этот каталог, это означает, что вы протестировали код на Maya2011.   -  person Bleeding Fingers    schedule 23.12.2013
comment
Что ж, я тестировал на Maya2011/2014 и только что предоставил скриншоты на Maya2011. Не в этом дело.   -  person Drake Guan    schedule 23.12.2013
comment
PyQt Culprit на самом деле ловит, отбрасывает и печатает ошибку. Вот почему нет красной полосы. Как-то это действие нужно остановить. Я считаю это ошибкой.   -  person Bleeding Fingers    schedule 23.12.2013


Ответы (1)


Если вы используете PyQt/PySide, поведение по умолчанию при получении исключения не будет отображать ошибку красным цветом. Я понятия не имею, почему, и не знаю ни одного переключателя, который делает это.

Чтобы добиться этого, вам нужно изменить функцию raiseError на что-то вроде этого:

def raiseError():
    import maya.OpenMaya as om
    import traceback as tb
    import sys
    try:
        pm.select("ooxx") # ooxx doesn't exist
    except Exception as exc:
        msg = "".join(tb.format_exception(*sys.exc_info())) # or any custom msg
        om.MGlobal.displayError(msg)
    finally:
        print "Something after the exception."

Таким образом, вы получите красный дисплей ошибки.

person Bleeding Fingers    schedule 20.12.2013
comment
Я считаю, что Callback гораздо больше отвечает за 1) отложенную оценку функции с запеченными аргументами и 2) одну запись отмены. - person Drake Guan; 24.12.2013
comment
Да, ты прав. Это нечто внутреннее, требующее глубокого самоанализа. Без сомнения, эта вещь оставила меня в загадке. - person Bleeding Fingers; 25.12.2013