examples - qt for python
Generación de código Python con pyside-uic (8)
Acabo de probar el QUILoader de Pyside, funciona 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 __name__ == ''__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_()
Utilicé Eclipse y QTDesigner para crear el archivo .ui (haga clic con el botón derecho en el módulo, "Nuevo -> Otro ...", elija "Qt Designer -> Qt Designer Form"). No se necesita una llamada uic explícita.
¿Cómo puedo generar código python desde un archivo QtDesigner? Encontré pyside-uic pero no puedo encontrar un ejemplo para la sintaxis. Ejecuto win7 y pythonxy con spyder.
El uso de QtUiTools (como se sugiere en otra respuesta) actualmente no es recomendado por el equipo de PySide.
Lea la historia completa aquí: https://groups.google.com/forum/?fromgroups=#!topic/pyside/_s1HPe6XTZs
La clase QUiLoader hará el trabajo sin hacer un archivo intermedio.
http://www.pyside.org/docs/pyside/PySide/QtUiTools/QUiLoader.html
Lea la documentación. En este caso particular, 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.
Mire C: / Python27 / Lib / site-packages / PySide / scripts / uic.py (o donde sea que tenga Python instalado). Si observa ese script, puede ver las opciones etiquetadas y descritas como en la página de manual (que no sé cómo ver correctamente en Windows. Se agradecen las sugerencias) aquí http://manpages.ubuntu.com/manpages/precise/man1/pyside-uic.1.html
Me confundí por un tiempo tratando de ver C: / Python27 / Lib / site-packages / pysideuic / pyside-uic.1 ya que pensé que ese debe ser el archivo al que se llama. Incluso tratar de ver eso como una página de manual es imposible para mí debido a todos los caracteres adicionales. ¡No puedes aprender la sintaxis intentando adivinar qué caracteres son extra y cuáles no!
En Windows, puede automatizar esto con un archivo por lotes, por supuesto, guardando un archivo de texto con la línea mencionada anteriormente (a continuación como referencia) con la extensión .bat como uic_generator.bat.
pyside-uic MyWindow.ui -o MyWindow.py
pyside-uic es más o menos idéntico a pyuic4, como tal, la página de manual especifica:
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)
Normalmente lo uso así:
pyside-uic -o output.py input.ui
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
Puede usar esta forma para cargar la interfaz de usuario y también puede obtener form_class así como la clase base como tipo de retorno ... pero si no desea convertir, de lo contrario, sí, la siguiente es la forma correcta.
pyside-uic.exe MyWindow.ui -o MyWindow.py
pyside-uic.exe MyWindow.ui -o MyWindow.py
es lo que he estado haciendo y está funcionando bien (que yo sepa)