18

さて、私は小さなPyQt4アプリを書いています。これは、外部コマンド(たとえば、「eject / dev / sr0」)を実行して終了する必要がある単一の「はい/いいえ」ダイアログです。

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

#!/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」コマンドが正しく呼び出されますが、その後もダイアログは表示されます。「いいえ」をクリックしてアプリを閉じる必要があります。コマンドの実行時にアプリを自動的に閉じます。何を追加/変更する必要がありますか?

4

4 に答える 4

46
btn.clicked.connect(self.close)

それが私の提案です

于 2012-08-02T07:15:53.250 に答える
9

lambda: os.system(cmd)複数のステートメントを持つ関数/メソッドに置き換えます。

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

...
    btn = QtGui.QPushButton('Yes', self)     
    btn.clicked.connect(self.buttonClicked)
...
于 2012-08-02T07:32:09.537 に答える
6

Step1: メイン クラスで「接続」を構築する必要があります。

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

Step2: 閉じるような関数を作成する:

def closeIt(self): 
        self.close()

「close」と名前を付けると競合が発生するため、わざと「closeIt」と名前を付けました。

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

于 2014-04-30T21:34:57.693 に答える