2012-08-02 30 views
11

Vâng, tôi đang viết một ứng dụng PyQt4 nhỏ, nó chỉ là một hộp thoại Có/Không có lệnh thực thi lệnh bên ngoài (ví dụ: 'eject/dev/sr0') và thoát.Hộp thoại PyQt - Cách thoát khỏi hộp thoại sau khi nhấn nút?

Ứng dụng chạy, nó thực hiện lệnh sau khi nhấn nút "Có", nhưng tôi không thể tự thoát khỏi hộp thoại khi thực hiện lệnh.

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

Đây là mã của tôi. Khi tôi nhấp vào "Có", nó gọi lệnh 'eject/dev/sr0' đúng cách, nhưng sau đó hộp thoại vẫn hiển thị. Tôi phải nhấp vào "Không" để đóng ứng dụng Tôi muốn nó tự động đóng khi lệnh được thực thi. Tôi nên thêm/sửa đổi những gì?

Trả lời

6

Thay lambda: os.system(cmd) với một hàm/phương pháp có nhiều báo cáo.

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) 

Đó sẽ là gợi ý của tôi

+0

Và dòng đơn giản này là giải pháp. Cảm ơn. –

5

Bước 1: trong Class chính cần phải được xây dựng một "kết nối":

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

Bước 2: Tạo một hàm muốn đóng:

def closeIt(self): 
     self.close() 

tôi ghi tên vào "closeIt "về mục đích bởi vì nếu bạn đặt tên nó là" gần ", một xung đột sẽ xảy ra.

Giải pháp này có lợi thế nếu GUI được tạo là plugin cho chương trình khác (như trong trường hợp của tôi QGIS), chỉ GUI hoạt động sẽ bị đóng và không phải toàn bộ chương trình.

Các vấn đề liên quan