2011-01-29 15 views
18

तो मैं अपने पायथन एप्लिकेशन के लिए क्यूटी के साथ अपना जीयूआई बना रहा हूं। अब मैं एक ऐसी स्थिति में आया हूं जहां एक बटन को धक्का दिया गया है, उचित स्थगित निष्पादित हो जाता है, हम कुछ कार्य करते हैं तो मुझे एक अलग विंडो खोलने की आवश्यकता होती है जिसमें एक या दो चीजें होती हैं। लेकिन मुझे यह पता लगाना प्रतीत नहीं होता कि यह नई अलग खिड़की कैसे बनाई जाए। क्या कोई मुझे एक उदाहरण बनाने का उदाहरण दे सकता है?पायथन: पीईक्यूटी पॉपअप विंडो

उत्तर

37

एक सामान्य त्रुटि जो आपको पागल कर सकती है वह कुछ पाइथन चर में बनाई गई पॉपअप विंडो के हैंडल को स्टोर करना भूल रही है जो जीवित रहेगी (उदाहरण के लिए मुख्य विंडो के डेटा सदस्य में)।

निम्नलिखित एक सरल कार्यक्रम है कि एक बटन जहां बटन दबाने एक पॉपअप

#!/usr/bin/env python 
#-*- coding: utf-8 -*- 

import sys 
from PyQt4.Qt import * 

class MyPopup(QWidget): 
    def __init__(self): 
     QWidget.__init__(self) 

    def paintEvent(self, e): 
     dc = QPainter(self) 
     dc.drawLine(0, 0, 100, 100) 
     dc.drawLine(100, 0, 0, 100) 

class MainWindow(QMainWindow): 
    def __init__(self, *args): 
     QMainWindow.__init__(self, *args) 
     self.cw = QWidget(self) 
     self.setCentralWidget(self.cw) 
     self.btn1 = QPushButton("Click me", self.cw) 
     self.btn1.setGeometry(QRect(0, 0, 100, 30)) 
     self.connect(self.btn1, SIGNAL("clicked()"), self.doit) 
     self.w = None 

    def doit(self): 
     print "Opening a new popup window..." 
     self.w = MyPopup() 
     self.w.setGeometry(QRect(100, 100, 400, 200)) 
     self.w.show() 

class App(QApplication): 
    def __init__(self, *args): 
     QApplication.__init__(self, *args) 
     self.main = MainWindow() 
     self.connect(self, SIGNAL("lastWindowClosed()"), self.byebye) 
     self.main.show() 

    def byebye(self): 
     self.exit(0) 

def main(args): 
    global app 
    app = App(args) 
    app.exec_() 

if __name__ == "__main__": 
    main(sys.argv) 

क्या मुझे लगता है कि अजगर उपयोगकर्ताओं के लिए आश्चर्य की बात हो सकती है और हो सकता है समस्या आप का सामना कर रहे है खोलता है के साथ एक मुख्य विंडो बनाता है यह तथ्य है कि यदि आप मुख्य विजेट में नए विजेट का संदर्भ संग्रहीत नहीं करते हैं self.w = MyPopup(...) के बजाय w = MyPopup(...) का उपयोग करके विंडो स्पष्ट रूप से प्रकट नहीं होती है (वास्तव में यह बनाई गई है और इसे तुरंत नष्ट कर दिया गया है)।

कारण यह है कि जब स्थानीय चर w गुंजाइश से बाहर हो जाता है क्योंकि कोई भी विजेट को स्पष्ट रूप से संदर्भित नहीं करता है तो विजेट हटा दिया जाता है। इसे स्पष्ट रूप से देखा जा सकता है क्योंकि यदि आप बटन को फिर से दबाते हैं तो आप देखेंगे कि दूसरा पॉपअप दिखाई देता है क्योंकि पहला बंद है।

इसका यह भी अर्थ है कि यदि आपको कई पॉपअप बनाने की आवश्यकता है तो उदाहरण के लिए उन्हें एक पायथन सूची में रखना होगा और उपयोगकर्ता द्वारा पॉपअप बंद होने के बाद आपको उन्हें इस सूची से हटा देना चाहिए। उदाहरण के बराबर कन्स्ट्रक्टर में self.w = [] में बदल रहा है और फिर self.w.append(MyPopup(...)) कर रहा है। ऐसा करने से आप कई पॉपअप खोल सकते हैं।

+0

अगर आप इसे डिज़ाइनर के साथ बनाते हैं तो दूसरी विंडो या विजेट के __init__ को self.setupUi (self) जोड़ने के लिए मत भूलना। –

3

आम तौर पर, आप सिर्फ कई parentless खिड़कियों someQWidget.show() साथ दिखाते हैं, जैसे:

w1 = QLabel("Window 1") 
w2 = QLabel("Window 2") 
w1.show() 
w2.show() 

लेकिन सबसे अधिक संभावना है, आप this की तरह एक मॉडल मानक संवाद चाहते हैं। modal dialogs को समझना भी सुनिश्चित करें।

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