问题
When i run the code i get the following error line 11: You need a shiboken-based type. Not sure what i am doing wrong here . When i run just the GetMayaWindow() its runs properly but when run it in init its gives me error
import shiboken
from PySide import QtGui
import maya.OpenMayaUI as apiUI
from cStringIO import StringIO
import pysideuic
import xml.etree.ElementTree as xml
def GetMayaWindow():
ptr = apiUI.MQtUtil.mainWindow()
if ptr is not None:
return shiboken.wrapInstance(long(ptr),QtGui.QMainWindow)
def LoadUiType(ui_file):
parsed = xml.parse(ui_file)
widget_class = parsed.find('widget').get('class')
form_class = parsed.find('class').text
with open(ui_file,'r') as f:
o = StringIO()
frame = {}
pysideuic.compileUi(f,o,indent = 0)
pyc = compile(o.getvalue(),'<string>','exec')
exec pyc in frame
form_class = frame ['Ui_{0}'.format(form_class)]
base_class = eval('QtGui.{0}'.format(widget_class))
return form_class,base_class
import shiboken
from PyQt4 import QtGui,QtCore,uic
from pymel.core import *
import pymel.core as pm
from pymel import *
ui_file = "D:/Swapnil/Workspace/R&D/modellingTools/ModellingTools.ui"
list_form,list_base = LoadUiType(ui_file)
class ModellingToolsUI(list_form,list_base):
def __init__(self, parent =GetMayaWindow()):
self.window_name = 'modellingTools'
if window(self.window_name,exists = True ):
deleteUI (seld.window_name)
super(ModellingToolsUI,self).__init__(parent)
self.setupUi(self)
def run_plugin():
ex = ModellingToolsUI()
ex.show()
回答1:
You cannot mix PySide and PyQt classes/objects.
The QtGui module gets imported twice, so sys.modules will contain an entry for both PySide.QtGui and PyQt4.QtGui. But since sys.modules is a dict, python cannot guarantee which one you will get when you reference QtGui later on.
In your case, it's obvious that QtGui.QMainWindow is actually a PyQt4 class, which is why you get that error.
来源:https://stackoverflow.com/questions/31117393/you-need-a-shiboken-based-type