Class 找不到我指定的属性(PySide、Maya)

Class can't find attribute I am specifying(PySide, Maya)

我不时学习Python/PySide for Maya,今天我尝试用PySide 制作一个class。

我正在尝试制作一个 window,里面有一个空列表。我用 UI 的常用 Maya 命令完成了相同的代码结构并且它起作用了。

但是当我尝试对 PySide 执行相同操作时,出现 AttributeError: 'VL_Test' object has no attribute 'ui_fk' 错误。

我错过了什么?

Code:

import maya.cmds as cmds
import maya.OpenMayaUI as omui

try:
    from PySide import QtCore, QtWidgets, QtGui
    from shiboken import wrapInstance    
except:
    from PySide2 import QtCore, QtWidgets, QtGui
    from shiboken2 import wrapInstance  


def getMayaWindow():
    pointer = omui.MQtUtil.mainWindow()
    if pointer is not None:
        return wrapInstance(long(pointer), QtWidgets.QWidget)


class VL_Test(object):
    def showUI(cls):
        win = cls()
        win.create()
        return win

    def __init__(self):
        self.window = 'vl_test'
        self.title = 'Test Remastered'
        self.size = (1000,650)
        self.supportsToolAction = False
        self.actionName = 'Create and Close'
        self.applyName = 'Create'
        self.closeName = 'Close'

    def create(self):
        if cmds.window(self.window, exists= True):
            cmds.deleteUI(self.window ,window= True)
        self.parentWindow = getMayaWindow()
        self.mainWindow = QtWidgets.QMainWindow(self.parentWindow)
        self.mainWindow.setObjectName(self.window)
        self.mainWindow.setWindowTitle(self.title)

        self.mainWidget = QtWidgets.QWidget()
        self.mainWindow.setCentralWidget(self.mainWidget)
        QtWidgets.QStyleFactory.create('Windows')
        self.mainLayout = QtWidgets.QHBoxLayout(self.mainWidget)
        self.ui_fk()

        self.mainWindow.show()

    def ui_fk(self):
        self.fkStrandGroupBox = QtWidgets.QGroupBox('FK Joints:')
        self.fkStrandLayout = QtWidgets.QHBoxLayout()
        self.mainLayout.addWidget(fkStrandGroupBox)
        self.fkStrandGroupBox.setLayout(fkStrandLayout)

        self.fkListWidget = QtWidgets.QListWidget()
        self.fkStrandLayout.addWidget(fkListWidget)

testWindow = VL_Test()
testWindow.create()

我想你只是在这些变量之前失去了一些 self fkStrandGroupBox fkStrandLayout fkListWidget

我在Maya 2017里运行,好像还可以

import maya.cmds as cmds
import maya.OpenMayaUI as omui

try:
    from PySide import QtCore, QtWidgets, QtGui
    from shiboken import wrapInstance
except:
    from PySide2 import QtCore, QtWidgets, QtGui
    from shiboken2 import wrapInstance


def getMayaWindow():
    pointer = omui.MQtUtil.mainWindow()
    if pointer is not None:
        return wrapInstance(long(pointer), QtWidgets.QWidget)


class VL_Test(object):
    def showUI(cls):
        win = cls()
        win.create()
        return win

    def __init__(self):
        self.window = 'vl_test'
        self.title = 'Test Remastered'
        self.size = (1000,650)
        self.supportsToolAction = False
        self.actionName = 'Create and Close'
        self.applyName = 'Create'
        self.closeName = 'Close'

    def create(self):
        if cmds.window(self.window, exists= True):
            cmds.deleteUI(self.window ,window= True)
        self.parentWindow = getMayaWindow()
        self.mainWindow = QtWidgets.QMainWindow(self.parentWindow)
        self.mainWindow.setObjectName(self.window)
        self.mainWindow.setWindowTitle(self.title)

        self.mainWidget = QtWidgets.QWidget()
        self.mainWindow.setCentralWidget(self.mainWidget)
        QtWidgets.QStyleFactory.create('Windows')
        self.mainLayout = QtWidgets.QHBoxLayout(self.mainWidget)
        self.ui_fk()

        self.mainWindow.show()

    def ui_fk(self):
        self.fkStrandGroupBox = QtWidgets.QGroupBox('FK Joints:')
        self.fkStrandLayout = QtWidgets.QHBoxLayout()
        self.mainLayout.addWidget(self.fkStrandGroupBox)
        self.fkStrandGroupBox.setLayout(self.fkStrandLayout)

        self.fkListWidget = QtWidgets.QListWidget()
        self.fkStrandLayout.addWidget(self.fkListWidget)

        # test
        self.fkListWidget.addItems(['a', 'b', 'c'])

testWindow = VL_Test()
testWindow.create()

而且,如果你使用PySide,不要添加QtWidgets,因为PySide没有QtWidgets

我比较喜欢用import *,因为我比较懒

try:
    from PySide.QtGui import *
    from PySide.QtCore import *
    from shiboken import wrapInstance
except:
    from PySide2.QtCore import *
    from PySide2.QtGui import *
    from PySide2.QtWidgets import *
    from PySide2.QtUiTools import *
    from shiboken2 import wrapInstance

如果考虑兼容性的话,可以试试这个。 https://github.com/mottosso/Qt.py