2012-08-02 17 views
11

Beh, sto scrivendo una piccola app PyQt4, è solo una singola finestra di dialogo Sì/No che deve eseguire un comando esterno (ad es. 'Eject/dev/sr0') e uscire.Dialogo PyQt - Come farlo uscire dopo aver premuto un pulsante?

L'app viene eseguita, esegue il comando dopo aver premuto il pulsante "Sì", ma non riesco a chiudere la finestra di dialogo quando si esegue il 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() 

Ecco il mio codice. Quando clicco su "Sì", richiama correttamente il comando 'eject/dev/sr0', ma dopo questo la finestra di dialogo è ancora visibile. Devo fare clic su "No" per chiudere l'applicazione. Vorrei che si chiudesse automaticamente quando viene eseguito il comando. Cosa dovrei aggiungere/modificare?

risposta

6

Sostituire lambda: os.system(cmd) con una funzione/metodo che ha più istruzioni.

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) 

Questo sarebbe il mio suggerimento

+0

E questa semplice linea era la soluzione. Grazie. –

5

Step1: nella classe principale deve essere costruire una "connessione":

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

Fase 2: Creazione di una funzione come per chiudere:

def closeIt(self): 
     self.close() 

ho chiamato a "closeIt "di proposito perché se lo chiami" vicino "si verificherà un conflitto.

Questa soluzione ha il vantaggio se la GUI creata è un plug-in per un altro programma (come nel mio caso QGIS), solo la GUI attiva verrà chiusa e non l'intero programma.

Problemi correlati