2012-08-02 17 views
11

ठीक है, मैं एक छोटा PyQt4 ऐप लिख रहा हूं, यह सिर्फ एक ही हां/नहीं संवाद है जिसे बाहरी आदेश निष्पादित करना है (उदा। 'निकालें/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' कमांड को ठीक से कॉल करता है, लेकिन उसके बाद संवाद अभी भी दिखाई देता है। मुझे ऐप को बंद करने के लिए "नहीं" पर क्लिक करना होगा, जब मैं आदेश निष्पादित करता हूं तो इसे स्वचालित रूप से बंद करना चाहता हूं। मुझे क्या जोड़ना/संशोधित करना चाहिए?

उत्तर

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) के लिए प्लगइन है, केवल सक्रिय जीयूआई बंद हो जाएगा और पूरे कार्यक्रम नहीं।

संबंधित मुद्दे