2012-08-02 89 views
11

嗯,我正在寫一個小型的PyQt4應用程序,它只是一個Yes/No對話框,它必須執行一個外部命令(例如'eject/dev/sr0')並退出。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

而這條簡單的線是解決方案。謝謝。 – 2012-08-02 08:18:13

5

第一步:在主類必須建立一個 「連接」:

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

第二步:創建一個功能要關閉:

def closeIt(self): 
     self.close() 

我命名爲「closeIt 「是故意的,因爲如果你把它命名爲」關閉「,就會發生衝突。

如果創建的GUI是另一個程序的插件(如我的情況下QGIS),此解決方案的優點是,只有活動的GUI將被關閉,而不是整個程序。

相關問題