Класс не может найти атрибут, который я указываю (PySide, Maya) - PullRequest
0 голосов
/ 26 августа 2018

Время от времени я изучаю Python / PySide для Maya, и сегодня я попытался создать класс с PySide.

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

Но когда я попытался сделать то же самое с PySide, я получил AttributeError: 'VL_Test' object has no attribute 'ui_fk' ошибку.

Что мне не хватает?

Код:

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()

1 Ответ

0 голосов
/ 28 августа 2018

Я думаю, вы просто теряете немного self до этих переменных fkStrandGroupBox fkStrandLayout fkListWidget

Я запускаю его в Maya 2017, кажется, все в порядке.

enter image description here

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

...