2010-03-22 24 views
20

Soy nuevo en Python y estoy empezando a aprender por mí misma programación GUI (con suerte) usando PyQT4.7 y Python 2.6QtDesigner con PyQt y Python 2.6

Acabo de descargar todo el paquete PyQt/QT4 (incluyendo QtDesigner) desde el sitio web de PyQT, sin embargo, parece que QTDesigner, que parece increíble de usar como novato (ya que puede ver todos los atributos/propiedades/valores predeterminados, etc.) de cada widget y editar visualmente las propiedades es genial, pero PyQT parece no establecer QTDesigner para integrar directamente con PyQT y PyQT scripts de generación de código python:

ie: Al presionar "Ver código", intenta ejecutar el script Diseñador-> C++ llamado (uic) en lugar del script pyuic.py, etc.

¿Hay alguna manera de hacer que QTDesigner se integre estrechamente con PyQT para la generación de código sobre la marcha como lo hace con C++?

Si no, ¿significa eso que tengo que codificar toda la GUI de QT dentro de mi IDE de Python y buscar toda la documentación y el código repetitivo para cada widget? (Parece muy ineficiente y poco elegante en comparación con solo tener la integración de QTDesigner + Python).

¿Cuál es la cadena de herramientas habitual // flujo de producción de usar Designer con PyQT? (Si no es posible la integración directa, ¿acaso los usuarios de python + pyQT omiten usar QTDesigner y escriben manualmente todo el código GUI de QT en python?)

Cualquier sugerencia/sugerencia adicional para un novato de PyQT sería apreciada. ¡Gracias!

ps Sé que muchos de ustedes probablemente me dirán que simplemente lo aspire y codifique toda la interfaz de usuario de QT a mano, pero si uso Designer mientras aprenden como se le preguntó anteriormente, proporcione una forma de hacerlo. Puedo aprenderlo más fácilmente, gracias!

Respuesta

20

Empecé a escribir mi primera aplicación PyQT (PyQT solo se usa para manejar GUI), y parece que esa buena cadena de herramientas es: QtDesigner para generar .ui sy manejar recursos y algunos IDE, que pueden configurar QtDesigner para editar aquellos. Yo uso Eclipse, porque es altamente personalizable. Puede compilar su .qrc y .ui por la demanda al hacer algo como esto al inicio de la aplicación, o en la instalación, o en cualquier otro momento:

os.system("pyrcc4.exe -o ui/images_rc.py ui/images/images.qrc") 
uic.compileUiDir(appDir + '/ui', True) 

y luego usando las clases generadas de esta manera:

class MyMainWindow(QtGui.QMainWindow): 

    def __init__(self, owner): 
     QtGui.QMainWindow.__init__(self) 
     # 'Ui_MyMainWindow' is the class, that was generated by uic, 
     # naming convention is: 'Ui_' plus the name of root widget in designer 
     self.ui = Ui_MyMainWindow() 
     self.ui.setupUi(self) 

o puede cargar directamente .ui cuando el contenedor ensu:

QtGui.QMainWindow.__init__(self) 
    self.ui = None 
    uic.loadUi('MyMainWindowUI.ui', self.ui) 
    #now you have the instance of Ui_MyMainWindow in self.ui too, as above 

nota, que he añadido el sufijo interfaz de usuario para .ui el nombre del archivo, que se hizo para evitar intersección nombre, nombre de la causa del archivo .py, generado por uic, no es el nombre de la clase que comienza con 'Ui_', sino solo el de la raíz del widget.

Y otra nota: al final del archivo generado lugares uic 'import% .qrc nombre% _rc' (de forma predeterminada es import images_rc) cadena, por lo que debe tener en cuenta esto cuando se utiliza pyrcc4.

Todo el enfoque es lo suficientemente flexible, se necesita todo el trabajo de codificación UI ficticia; pero aún puede hacer algunos ajustes en el atributo MyMainWindow.ui, donde se establece la instancia de Ui_MyMainWindow; y evita la herencia innecesaria. Personalmente, hago los métodos _connectSlots y _initIntefrace en MyMainWindow para hacer algo que el diseñador de trabajos no puede.

Todavía tengo que tener en cuenta que escribir código de interfaz por ti mismo es un buen enfoque, porque el código, generado por uic, es feo. Prefiero cargar .ui en su lugar por loadUi() debido a esto :) Y si tiene muchos controles personalizados de PyQT, es tan atractivo traerlos a QtDesigner ..

1

Puede ejecutar pyuic (o más bien pyuic4) de la mano, en su consola. Puede hacer que su GUI use el diseñador con Python, tal como lo haría con C++.

Por cierto: escribí todas las cosas de la GUI para mi aplicación (10k de código) a mano. Realmente no me gustan los diseñadores de GUI y el código generado, cuando necesitas modificar algo.

0

QtDesigner usa uic.exe para generar en el volar código C++. uic.exe es una herramienta de línea de comandos, obtiene los nombres de archivo como parámetros de entrada. Para la integración con python, puede escribir un programa python que use pyuic.py, haga coincidir las entradas con la entrada uic.exe (orden, conmutadores, etc.), conviértalo en un ejecutable (usando py2exe) y cambie el nombre del ejecutable a uic.exe. luego reemplácelo con uic.exe en el directorio bin de Qt (uic.exe no existe en PyQt como sé). Debería tener cuidado con los argumentos de entrada uic.exe y su macro manuscrita (deben coincidir).

Creo que su programa necesitará conocer la ruta de Python (para poder usar pyuic). si está usando Windows, puede obtener la ruta del registro.

2

Lo que hice fue crear mi propio ejecutable uic que es un envoltorio para el script pyuic.py.

Tendrá ...

  1. Para conseguir e instalar py2exe

  2. Reemplazar PYTHON_PATH en el código de abajo uic.py

  3. Editar el archivo en el qt.conf site-packages \ PyQt4 y establecer Binaries = Ruta a la carpeta que contiene el exe uic una vez que está hecho.

  4. uic.py Put y setup.py en la misma carpeta

  5. En el símbolo del sistema para navegar a la carpeta donde setup.py y uic.py entonces se corre el siguiente comando "setup.py pitón py2exe ".

//----uic.py

#uic.py 
import subprocess 
import sys 

args = "" 

for arg in sys.argv: 
    if sys.argv[0] != arg: 
     args += arg + " " 


# Start pyuic.py script 
command = 'python %PYTHON_PATH%\\PyQt4\\uic\\pyuic.py '+ args 
out = '' 


child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE) 
complete = False 
while True: 
    out = child.stderr.read(1) 
    if out == '' and child.poll() != None: 
     break 
    if out != '': 
     sys.stdout.write(out) 
     sys.stdout.flush() 

// ----- setup.py

#setup.py  
from distutils.core import setup 
import py2exe 

setup(windows=[{"script":"uic.py"}], options={"py2exe" : {"includes" : ["sip", "PyQt4.QtCore"]}})