pyqt5 Tutorial
Empezando con pyqt5
Buscar..
Observaciones
Esta sección proporciona una descripción general de qué es pyqt5, y por qué un desarrollador puede querer usarlo.
También debe mencionar cualquier tema grande dentro de pyqt5, y vincular a los temas relacionados. Dado que la Documentación para pyqt5 es nueva, es posible que deba crear versiones iniciales de esos temas relacionados.
Instalación o configuración
- Instale Anaconda (PyQt5 es incorporado), especialmente para usuarios de Windows.
- Integrar QtDesigner y QtUIConvert en PyCharm (herramientas externas)
- Escribe demo
- new window.ui por herramienta externa (QtDesigner)
- convertir a window.py por una herramienta externa (PyUIConv)
- manifestación
import sys from PyQt5.QtWidgets import QApplication,QMainWindow from window import Ui_MainWindow if __name__ == '__main__': app = QApplication(sys.argv) w = QMainWindow() ui = Ui_MainWindow() ui.setupUi(w) w.show() sys.exit(app.exec_())
Hola mundo ejemplo
Este ejemplo crea una ventana simple con un botón y una edición de línea en un diseño. También muestra cómo conectar una señal a una ranura, de modo que al hacer clic en el botón se agrega algo de texto a la edición de línea.
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Hello World')
w.show()
sys.exit(app.exec_())
Análisis
app = QtWidgets.QApplication(sys.argv)
Cada aplicación PyQt5 debe crear un objeto de aplicación. El parámetro sys.argv es una lista de argumentos de una línea de comando. Los scripts de Python se pueden ejecutar desde el shell.
w = QWidget()
El widget QWidget
es la clase base de todos los objetos de la interfaz de usuario en PyQt5. Proporcionamos el constructor predeterminado para QWidget
. El constructor por defecto no tiene padre. Un widget sin padre se llama ventana.
w.resize(250, 150)
El método resize resize()
cambia el tamaño del widget. Tiene 250px de ancho y 150px de alto.
w.move(300, 300)
El método move()
mueve el widget a una posición en la pantalla en x = 300, y = 300 coordenadas.
w.setWindowTitle('Hello World')
Aquí ponemos el título a nuestra ventana. El título se muestra en la barra de título.
w.show()
El método show()
muestra el widget en la pantalla. Un widget se crea primero en la memoria y luego se muestra en la pantalla.
sys.exit(app.exec_())
Finalmente, ingresamos al mainloop de la aplicación. El manejo del evento comienza desde este punto. Mainloop recibe eventos del sistema de ventanas y los envía a los widgets de la aplicación. Mainloop finaliza si llamamos al método exit()
o el widget principal se destruye. El método sys.exit()
garantiza una salida limpia. El entorno será informado de cómo terminó la aplicación.
El método exec_()
tiene un guión bajo. Es porque el exec es una palabra clave de Python. Y así, se exec_()
su lugar.
Agregar un icono de aplicación
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Análisis
Argumentos de función en Python
En Python, las funciones definidas por el usuario pueden tomar cuatro tipos diferentes de argumentos.
- Argumentos predeterminados:
Definición de la función
def defaultArg( name, msg = "Hello!"):
Llamada de función
defaultArg( name)
- Argumentos requeridos:
Definición de la función
def requiredArg (str,num):
Llamada de función:
requiredArg ("Hello",12)
- Argumentos de palabras clave:
Definición de la función
def keywordArg( name, role ):
Llamada de función
keywordArg( name = "Tom", role = "Manager")
o
keywordArg( role = "Manager", name = "Tom")
- Número variable de argumentos:
Definición de la función
def varlengthArgs(*varargs):
Llamada de función
varlengthArgs(30,40,50,60)
class Example(QWidget):
def __init__(self):
super().__init__()
...
Tres cosas importantes en la programación orientada a objetos son las clases, los datos y los métodos. Aquí creamos una nueva clase llamada Example
. La clase Example
hereda de la clase QWidget
. Esto significa que llamamos a dos constructores: el primero para la clase Example
y el segundo para la clase heredada. El método super()
devuelve el objeto principal de la clase Example
y llamamos a su constructor. La self
variable se refiere al objeto en sí.
¿Por qué hemos usado __init__
?
Mira esto:
class A(object):
def __init__(self):
self.lst = []
class B(object):
lst = []
y ahora prueba:
>>> x = B()
>>> y = B()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1, 2]
>>> x.lst is y.lst
True
y esto:
>>> x = A()
>>> y = A()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1]
>>> x.lst is y.lst
False
¿Significa esto que x en la clase B se establece antes de la instanciación?
Sí, es un atributo de clase (se comparte entre instancias). Mientras que en la clase A es un atributo de instancia.
self.initUI()
La creación de la GUI se delega en el método initUI()
.
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))
Los tres métodos han sido heredados de la clase QWidget
. El setGeometry()
hace dos cosas: ubica la ventana en la pantalla y establece su tamaño. Los primeros dos parámetros son las posiciones x e y de la ventana. El tercero es el ancho y el cuarto es la altura de la ventana. De hecho, combina los métodos resize()
y move()
en un método. El último método establece el icono de la aplicación. Para ello, hemos creado un objeto QIcon
. El QIcon
recibe la ruta de acceso a nuestro icono que se mostrará.
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
La aplicación y los objetos de ejemplo se crean. Se inicia el bucle principal.
Mostrando una sugerencia
import sys
from PyQt5.QtWidgets import (QWidget, QToolTip,
QPushButton, QApplication)
from PyQt5.QtGui import QFont
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('SansSerif', 10))
self.setToolTip('This is a <b>QWidget</b> widget')
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
btn.resize(btn.sizeHint())
btn.move(50, 50)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Tooltips')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Análisis
QToolTip.setFont(QFont('SansSerif', 10))
Este método estático establece una fuente utilizada para representar información sobre herramientas. Utilizamos una fuente de 10px SansSerif.
self.setToolTip('This is a <b>QWidget</b> widget')
Para crear una información sobre herramientas, llamamos al método setTooltip()
. Podemos utilizar el formato de texto enriquecido.
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
Creamos un widget de botón pulsador y configuramos una descripción para él.
btn.resize(btn.sizeHint())
btn.move(50, 50)
El botón está siendo redimensionado y movido en la ventana. El método sizeHint()
da un tamaño recomendado para el botón.
Empaquetar su proyecto en excutable / instalador
cx_Freeze - una herramienta puede empaquetar su proyecto en excutable / installer
- después de instalarlo por pip, para empaquetar
demo.py
, necesitamossetup.py
continuación.
import sys
from cx_Freeze import setup, Executable
# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
"excludes": ["tkinter"],
"include_files":[('./platforms','./platforms')] # need qwindows.dll for qt5 application
}
# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
base = "Win32GUI"
setup( name = "demo",
version = "0.1",
description = "demo",
options = {"build_exe": build_exe_options},
executables = [Executable("demo.py", base=base)])
- luego construir
python .\setup.py build
- entonces dist
python .\setup.py bdist_msi