2012-08-02 29 views
11

Bueno, estoy escribiendo una pequeña aplicación PyQt4, es solo un diálogo Sí/No que tiene que ejecutar un comando externo (por ejemplo, 'expulsar/dev/sr0') y salir.Diálogo PyQt - ¿Cómo hacer que se cierre después de presionar un botón?

La aplicación se ejecuta, ejecuta el comando después de presionar el botón "Sí", pero no puedo hacer que el diálogo salga al ejecutar el comando.

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import sys 
import os 
import subprocess 
from PyQt4 import QtGui 
from PyQt4 import QtCore 
from subprocess import call 
cmd = 'eject /dev/sr0' 

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 

     self.initUI() 

    def initUI(self): 

     btn = QtGui.QPushButton('Yes', self)  
     btn.clicked.connect(lambda: os.system(cmd)) 
     btn.resize(180, 40) 
     btn.move(20, 35)  

     qbtn = QtGui.QPushButton('No', self) 
     qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit) 
     qbtn.resize(180, 40) 
     qbtn.move(20, 80) 

     self.setWindowTitle('Test')  
     self.show() 

def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

Aquí está mi código. Cuando hago clic en "Sí", se llama al comando 'expulsar/dev/sr0' correctamente, pero después de eso, el cuadro de diálogo sigue siendo visible. Tengo que hacer clic en "No" para cerrar la aplicación. Me gustaría que se cierre automáticamente cuando se ejecuta el comando. ¿Qué debería agregar/modificar?

Respuesta

6

Reemplazar lambda: os.system(cmd) con una función/método que tiene varias instrucciones.

def buttonClicked(self): 
    os.system(cmd) 
    QtCore.QCoreApplication.instance().quit() 

... 
    btn = QtGui.QPushButton('Yes', self)  
    btn.clicked.connect(self.buttonClicked) 
... 
31
btn.clicked.connect(self.close) 

Ese sería mi sugerencia

+0

Y esta línea simple fue la solución. Gracias. –

5

Paso 1: en la clase principal debe ser construir una "conexión":

self.ui.closeButton.clicked.connect(self.closeIt) 

Paso 2: Creación de una función como la de cerrar:

def closeIt(self): 
     self.close() 

me llamaba a "closeIt "a propósito porque si lo llamas" cerrar "se producirá un conflicto.

Esta solución tiene la ventaja de que si la GUI creada es un complemento para otro programa (como en mi caso, QGIS), solo se cerrará la GUI activa y no todo el programa.

Cuestiones relacionadas