2017-03-17 2 views
0

J'essaye de convertir un vieux manuscrit de Maya python en Maya 2017. En 2017 ils ont fait quelques changements comprenant le passage de PySide à PySide 2 et de Qt4 à Qt5. Je n'ai aucune expérience avec l'une de ces bibliothèques ou même python.Conversion d'un script Python qt4 en pyside2 qt5: où mes imports échouent-ils?

La première chose que j'ai faite a été d'essayer de l'exécuter à travers pyqt4topyqt5 sans les changements nécessaires détectés.

Je crois que la fonctionnalité de base du script est la même dans les deux versions, mais le chargement de l'interface graphique échoue en raison de ces changements. Le script original d'importer les bibliothèques est la suivante:

import shiboken 
from PySide import QtGui 
import maya.OpenMayaUI as apiUI 
from cStringIO import StringIO 
import pysideuic 
import xml.etree.ElementTree as xml 

def get_maya_window(): 

    ptr = apiUI.MQtUtil.mainWindow() 
    if ptr is not None: 
     return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow) 

def load_ui_type(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 

     # Fetch the base_class and form class based on their type in the xml from design 
     form_class = frame['Ui_{0}'.format(form_class)] 
     base_class = eval('QtGui.{0}'.format(widget_class)) 

    return form_class, base_class 

j'ai changé toutes les instances de PySide à PySide2, shiboken à shiboken2 (un autre changement MAYA 2017), et pysideuic à pyside2uic. Lors du test du script, je suis l'erreur

Error: line 1: AttributeError: file <string> line 1: 'module' object has no attribute 'QMainWindow' # 

(ligne 1 fait référence à la ligne dans un autre script:

from JUM.core.loadUIFile import get_maya_window, load_ui_type 

qui appelle ce fichier)

Après un coup d'oeil à travers la documentation QT5 , J'ai déterminé que QMainWindow est maintenant une partie de QtWidgets, contenue dans PyQt5, plutôt que QtGui donc je l'ai également substitué. Actuellement, le code de script est

import shiboken2 
from PyQt5 import QtWidgets 
import maya.OpenMayaUI as apiUI 
from cStringIO import StringIO 
import pyside2uic 
import xml.etree.ElementTree as xml 

def get_maya_window(): 

    ptr = apiUI.MQtUtil.mainWindow() 
    if ptr is not None: 
     return shiboken2.wrapInstance(long(ptr), QtWidgets.QMainWindow) 

def load_ui_type(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 = {} 

     pyside2uic.compileUi(f, o, indent = 0) 
     pyc = compile(o.getvalue(), '<string>', 'exec') 
     exec pyc in frame 

     # Fetch the base_class and form class based on their type in the xml from design 
     form_class = frame['Ui_{0}'.format(form_class)] 
     base_class = eval('QtWidgets.{0}'.format(widget_class)) 

    return form_class, base_class 

Pourtant, je reçois toujours exactement la même erreur, donc je pense que quelque chose ne va pas avec mon importation de module. Quelqu'un peut-il avoir la connaissance de Qt5 en python carillon?

+1

Vous avez certainement besoin d'importer depuis PySide2, pas PyQt5? – ekhumoro

+0

@ekhumoro J'ai essayé ça aussi, avec exactement le même résultat. – mlamp

+0

Vous pouvez commencer par jeter manuellement tout ce qui n'est pas nécessaire pour que l'erreur apparaisse. – Trilarion

Répondre

0

une réponse simple serait ceci. QTWidgets pas QTGui. Dans Pyside2, vous importez non seulement shiboken2 et wrapinstance2, mais tout va bien dans QTWidgets.

def get_maya_window(): 

    ptr = apiUI.MQtUtil.mainWindow() 
    if ptr is not None: 
     return shiboken2.wrapInstance2(long(ptr), QtWidgets.QWidget)