web-dev-qa-db-fra.com

Dialogue PyQt - Comment le faire quitter après avoir appuyé sur un bouton?

Eh bien, j'écris une petite application PyQt4, c'est juste une seule boîte de dialogue Oui/Non qui doit exécuter une commande externe (par exemple 'éjecter/dev/sr0') et quitter.

L'application s'exécute, elle exécute la commande après avoir appuyé sur le bouton "Oui", mais je ne peux pas faire quitter la boîte de dialogue lors de l'exécution de la commande.

#!/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()

Voici mon code. Lorsque je clique sur "Oui", il appelle correctement la commande "éjecter/dev/sr0", mais après cela, la boîte de dialogue est toujours visible. Je dois cliquer sur "Non" pour fermer l'application. Je voudrais qu'elle se ferme automatiquement lorsque la commande est exécutée. Que dois-je ajouter/modifier?

14
Laszlo Meller

Remplacez lambda: os.system(cmd) par une fonction/méthode qui a plusieurs instructions.

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

...
    btn = QtGui.QPushButton('Yes', self)     
    btn.clicked.connect(self.buttonClicked)
...
8
Jesse Harris
btn.clicked.connect(self.close)

Ce serait ma suggestion

36
Manjabes

Étape 1: dans la classe principale, il faut créer une "connexion":

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

Étape 2: Création d'une fonction comme pour fermer:

def closeIt(self): 
        self.close()

J'ai nommé intentionnellement "closeIt" car si vous le nommez "close", un conflit se produira.

Cette solution a l'avantage si l'interface graphique créée est un plugin pour un autre programme (comme dans mon cas QGIS), seule l'interface graphique active sera fermée et pas le programme entier.

5
g07kore

Sous-classe QDialog (), puis fermez-le à l'aide de votre objet.

class Dialog(QDialog):
    """
        Subclassing QDialog class.
    """
    def __init__(self):
        QDialog.__init__(self)

    def close_clicked(self):
        self.close()

Dans votre fonction principale, écrivez le code suivant

dialogbox = Dialog()  # we subclasses QDialog into Dialog
b1= QPushButton("Close",dialogbox)
b1.clicked.connect(dialogbox.close_clicked)
dialogbox.exec_()
0
user12121533