正如我在评论中所说,我可以在2017年和2017年复制你的bug更新2,但在2018年工作得很好。
幸运的是,有一个足够简单的解决方案,您只需将方法移出
__init__
使其成为普通的实例方法。现在按预期执行错误。(老实说,在内部有一个嵌套函数
爱因斯坦
不管怎么说有点奇怪,我会把它搬走,不管它是不是小车)
有趣的是,静态方法也有同样的问题!如果你试着在课堂上给他们打电话,他们会挂起来的。但是,如果你在课堂之外调用它,它可以正常工作,或者如果你用
try
except
当从类内调用时,它现在将工作。
查看以下代码。我包括3个实例、一个实例方法、一个静态方法和一个用
尝试
除了
:
from PySide2 import QtWidgets, QtGui, QtCore
from shiboken2 import wrapInstance
import maya.OpenMayaUI as mui
mainWin = None
def showUI():
global mainWin
if mainWin != None:
print "reloading UI..."
mainWin.close()
mainWin = myWindow()
mainWin.show()
def getMayaWindow():
ptr = mui.MQtUtil.mainWindow()
return wrapInstance(long(ptr), QtWidgets.QWidget)
class myWindow(QtWidgets.QDialog):
def __init__(self, parent=getMayaWindow()):
super(myWindow, self).__init__(parent, QtCore.Qt.WindowStaysOnTopHint)
# Works.
self.testButton = QtWidgets.QPushButton('error')
self.testButton.clicked.connect(self.funcApply)
# Fails.
self.testButton2 = QtWidgets.QPushButton('error static method')
self.testButton2.clicked.connect(self.staticFuncApply)
# Works.
self.testButton3 = QtWidgets.QPushButton('error static method with try/except')
self.testButton3.clicked.connect(self.staticTryExceptFuncApply)
self.layout = QtWidgets.QBoxLayout(QtWidgets.QBoxLayout.TopToBottom, self)
self.layout.addWidget(self.testButton)
self.layout.addWidget(self.testButton2)
self.layout.addWidget(self.testButton3)
self.setLayout(self.layout) # Normally need to specify what layout this widget needs to use.
# Move this out and make it a normal instanced method.
# This will work as expected.
def funcApply(self):
oooo # this should error!
# Static methods still broken, but ok in Maya 2018.
@staticmethod
def staticFuncApply():
oooo
# Static methods wrapped with try except works.
@staticmethod
def staticTryExceptFuncApply():
try:
oooo
except Exception as e:
print e
showUI()
# myWindow.staticFuncApply() # Calling static method outside of class works ok.
所有这些工作在玛雅2018年,但静态方法将在2017年失败。
希望您可以避免使用静态方法,因为将其全部包装在
尝试
除了
不是一个实际的解决方案。您还可以尝试将您的maya更新到2017更新4,以查看它是否已修补。
希望这有帮助!
这篇博客讨论了一个在PySide2中使用Qt创建UI时遇到的问题,即静态方法在Maya 2017和2018中作为信号连接器的行为差异。作者发现静态方法在Maya 2017中会导致程序挂起,但在2018年则可以正常工作,除非直接从类内部调用。为了解决这个问题,建议避免使用静态方法,或者将它们包装在try/except块中。此外,升级到Maya 2017的更新4可能是另一种可能的解决方案。

被折叠的 条评论
为什么被折叠?



