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?
Vous avez certainement besoin d'importer depuis PySide2, pas PyQt5? – ekhumoro
@ekhumoro J'ai essayé ça aussi, avec exactement le même résultat. – mlamp
Vous pouvez commencer par jeter manuellement tout ce qui n'est pas nécessaire pour que l'erreur apparaisse. – Trilarion