web-dev-qa-db-fra.com

Génération de code Python avec pyside-uic

Comment générer du code python à partir d'un fichier QtDesigner? J'ai trouvé pyside-uic mais je ne trouve pas d'exemple de syntaxe. J'utilise win7 et pythonxy avec spyder.

16
ArtDijk

pyside-uic est plus ou moins identique à pyuic4, la page de manuel spécifie:

Usage:
        pyside-uic [options] <ui-file>

Options:
    --version
        show program's version number and exit

    -h,--help
        show this help message and exit

    -oFILE,--output=FILE
        write generated code to FILE instead of stdout

    -x,--execute
        generate extra code to test and display the class

    -d,--debug
        show debug output

    -iN,--ident=N
        set indent width to N spaces, tab if N is 0 (default: 4)

Je l'utilise habituellement comme ça:

pyside-uic -o output.py input.ui
31
FrederikNS

Je viens d'essayer le QUILoader de Pyside, ça fonctionne bien:

from PySide import QtGui  
from PySide import QtCore
from PySide import QtUiTools

class MyWidget(QtGui.QMainWindow):
    def __init__(self, *args):  
       apply(QtGui.QMainWindow.__init__, (self,) + args)

       loader = QtUiTools.QUiLoader()
       file = QtCore.QFile("pyside_ui_qtdesigner_form_test.ui")
       file.open(QtCore.QFile.ReadOnly)
       self.myWidget = loader.load(file, self)
       file.close()

       self.setCentralWidget(self.myWidget)

if __== '__main__':  
   import sys  
   import os
   print("Running in " + os.getcwd() + " .\n")

   app = QtGui.QApplication(sys.argv)  

   win  = MyWidget()  
   win.show()

   app.connect(app, QtCore.SIGNAL("lastWindowClosed()"),
               app, QtCore.SLOT("quit()"))
   app.exec_()

J'ai utilisé Eclipse et QTDesigner pour créer le fichier .ui (clic droit sur le module, "Nouveau -> Autre ..", choisissez "Qt Designer -> Qt Designer Form"). Aucun appel explicite n'est nécessaire.

19
Sven
import pysideuic
import xml.etree.ElementTree as xml
from cStringIO import StringIO

def loadUiType(uiFile):
    """
    Pyside "loadUiType" command like PyQt4 has one, so we have to convert the 
    ui file to py code in-memory first and then execute it in a special frame
    to retrieve the form_class.
    """
    parsed = xml.parse(uiFile)
    widget_class = parsed.find('widget').get('class')
    form_class = parsed.find('class').text

    with open(uiFile, '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 designer
        form_class = frame['Ui_%s'%form_class]
        base_class = eval('QtGui.%s'%widget_class)

    return form_class, base_class

Vous pouvez utiliser cette méthode pour charger l'interface utilisateur. Vous pouvez également obtenir form_class ainsi que la classe de base en tant que type de retour ... mais si vous ne souhaitez pas convertir, sinon Oui, la procédure suivante est la bonne.

pyside-uic.exe MyWindow.ui -o MyWindow.py
6
user1176501
pyside-uic.exe MyWindow.ui -o MyWindow.py 

est ce que je fais et ça marche bien (autant que je sache)

4
Mike

La classe QUiLoader fera le travail sans créer de fichier intermédiaire.

http://www.pyside.org/docs/pyside/PySide/QtUiTools/QUiLoader.html

2
Neon22

Lisez la documentation. Dans ce cas particulier, http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#pyuic4 :

The pyuic4 utility is a command line interface to the uic module. The command has the following syntax:

pyuic4 [options] .ui-file

The full set of command line options is:
-h, --help  A help message is written to stdout.
--version   The version number is written to stdout.
-i N, --indent=N
    The Python code is generated using an indentation of N spaces. If N is 0 then a tab is used. The default is 4.
-o FILE, --output=FILE
    The Python code generated is written to the file FILE.
-p, --preview   The GUI is created dynamically and displayed. No Python code is generated.
-w, --pyqt3-wrapper
    The generated Python code includes a small wrapper that allows the GUI to be used in the same way as it is used in PyQt v3.
-x, --execute   The generated Python code includes a small amount of additional code that creates and displays the GUI when it is executes as a standalone application.
--from-imports  Resource modules are imported using from . import rather than a simple import.
1
user395760

L’utilisation de QtUiTools (comme suggéré dans une autre réponse) est actuellement découragée par l’équipe PySide. 

Lisez l'histoire complète ici: https://groups.google.com/forum/?fromgroups=#!topic/pyside/_s1HPe6XTZs

1
Max Ekman

Regardez C:\Python27\Lib\site-packages\PySide\scripts\uic.py (ou partout où vous avez installé Python). Si vous consultez ce script, vous pouvez voir les options intitulées et décrites dans la page de manuel (que je ne sais pas comment afficher correctement sous Windows. Conseils appréciés.) Ici http://manpages.ubuntu.com/ pages de manuel/precise/man1/pyside-uic.1.html

Je me suis un peu perdu en essayant de regarder C:\Python27\Lib\site-packages\pysideuic\pyside-uic.1 car je pensais que ce devait être le fichier appelé. Même essayer de voir cela comme une page de manuel est impossible pour moi à cause de tous les caractères supplémentaires. Vous ne pouvez pas apprendre la syntaxe en essayant de deviner quels caractères sont extra et ceux qui ne le sont pas!

Sur Windows, vous pouvez bien sûr automatiser cela avec un fichier de commandes en sauvegardant un fichier texte avec la ligne mentionnée ci-dessus (ci-dessous pour référence) avec une extension .bat comme uic_generator.bat.

pyside-uic MyWindow.ui -o MyWindow.py

0
steventaitinger