Minimizar al tray un programa hecho en PyQt5
![Minimizar al tray un programa hecho en PyQt5](/content/images/size/w1200/2023/10/programa.png)
Como podeis ver en el post sobre Mi primer CRUD con Python, tenía hecho un programa que simplemente era un registro de usuarios implementado en Python con PyQt5 y Mysql3 como base de datos. Funcionaba bien pero había dejado para más adelante algunas funciones (ya sabéis lo que pasa con estas cosas). Ahora he escrito unos cambios y tiene icono en el tray del sistema y se puede cerrar, minimizar y maximizar a discrección.
![](https://myblog.clonbg.es/content/images/2023/10/icono-tray.png)
![](https://myblog.clonbg.es/content/images/2023/10/menu-icono.png)
Veamos como lo he hecho:
- Lo primero que he hecho ha sido añadir un icono y un título a la barra del programa con estas dos líneas:
dlg.setWindowTitle('Base de datos de usuarios en SQLite3') # Nombre del título
dlg.setWindowIcon(QIcon('usuario.png')) # Icono del título
Evidentemente hay que tener un icono con el nombre usuario.png.
- Añadir, en este caso el mismo icono, al tray del sistema:
trayIcon = QSystemTrayIcon(QIcon('usuario.png'), parent=app)
trayIcon.setToolTip('Base de Datos SQLite3')
def icono():
if dlg.checkIcono.isChecked():
trayIcon.show()
else:
trayIcon.hide()
- Aquí creamos el menu del icono y le añadimos tres acciones, maximizar, minimizar y cerrar, después eliminamos maximizar ya que no le hace falta la primera vez.
menu = QMenu()
minimizeAction = menu.addAction('Minimizar')
minimizeAction.triggered.connect(minimiza)
quitAction = menu.addAction('Cerrar')
quitAction.triggered.connect(dlg.close)
trayIcon.setContextMenu(menu) # Aquí se añaden al icono
maximizeAction = menu.addAction('Maximizar')
maximizeAction.triggered.connect(maximiza)
menu.removeAction(maximizeAction) # Una vez creada se elimina del icono
- Más tarde centramos la ventana, he necesitado hacerlo ya que cuando se maximizaba desde el menú salía la barra fuera de la pantalla.
qr = dlg.frameGeometry()
cp = QtWidgets.QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
dlg.move(qr.topLeft())
- Las funciones que minimizan y maximizan la aplicación. El motivo de eliminar la acción de cerrar y añadirla más tarde es para que siempre esté al final del menú.
def minimiza():
dlg.hide()
menu.removeAction(quitAction)
menu.addAction(maximizeAction)
menu.addAction(quitAction)
menu.removeAction(minimizeAction)
def maximiza():
dlg.show()
menu.removeAction(quitAction)
menu.addAction(minimizeAction)
menu.addAction(quitAction)
menu.removeAction(maximizeAction)
- Le he añadido la opción de minimizar y maximizar al hacer doble click en el icono
def onTrayIconActivated(reason):
if reason == trayIcon.DoubleClick:
# print('double click')
if dlg.isVisible():
minimiza()
else:
maximiza()
trayIcon.activated.connect(onTrayIconActivated)
Otras funciones añadidas son:
- Comprobamos que el DNI no exista en la base de datos
- Comprobamos que el nombre y apellidos solo acepten letras
- Mensajes de error varios
El código completo lo puedes encontrar en mi repositorio de Github
Salu2