2012-08-02 38 views
11

私は小さなPyQt4アプリケーションを書いていますが、それは外部コマンド(例えば 'eject/dev/sr0')を実行して終了する必要があるYes/Noダイアログです。PyQtダイアログ - ボタンを押した後に終了するにはどうすればいいですか?

アプリが実行されると、「はい」ボタンを押した後にコマンドが実行されますが、コマンド実行時にダイアログ自体を終了することはできません。

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

ここは私のコードです。 「はい」をクリックすると、「eject/dev/sr0」コマンドが正しく呼び出されますが、その後もダイアログは表示されます。コマンドを実行したときに自動的に閉じたいアプリを閉じるには「いいえ」をクリックする必要があります。追加/変更するものは何ですか?

答えて

6

複数のステートメントを持つ関数/メソッドでlambda: os.system(cmd)を交換してください。

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) 

+0

そしてこの単純な行が解決策でした。ありがとう。 –

5

ステップ1:メインクラスは、 "接続" を構築する必要に:

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

ステップ2:クローズしたい機能の作成:

def closeIt(self): 
     self.close() 

私はのcloseit「に命名あなたがそれを「近い」と命名すると、衝突が起こるからです。

このソリューションは、作成されたGUIが(私の場合QGISのような)別のプログラム用のプラグインであれば、アクティブなGUIだけが閉じられ、プログラム全体ではなく閉じられるという利点があります。

関連する問題