【问题标题】:Class can't find attribute I am specifying(PySide, Maya)类找不到我指定的属性(PySide,Maya)
【发布时间】:2018-08-28 10:24:58
【问题描述】:

我不时地在为 Maya 学习 Python/PySide,今天我尝试用 PySide 制作一个类。

我正在尝试制作一个里面有一个空列表的窗口。我已经为 UI 使用通常的 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()

【问题讨论】:

  • 你确定你的缩进是正确的。有时,当我在定义时缩进太远或不够远时会发生这种情况。
  • 我检查了几次。看起来不像是缩进问题。
  • 我确认这听起来像是缺少缩进。我没有玛雅,所以我不能尝试:/

标签: python pyqt pyside maya


【解决方案1】:

我认为你只是在这些变量之前失去了一些selffkStrandGroupBoxfkStrandLayoutfkListWidget

我在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多