복붙노트

[PYTHON] Python : PyQt 팝업 창

PYTHON

Python : PyQt 팝업 창

그래서 저는 파이썬 응용 프로그램을위한 Qt로 GUI를 만들고 있습니다. 이제는 버튼이 푸시 된 후 적절한 지연이 실행 된 다음 몇 가지 작업을 수행 한 다음 하나 또는 두 가지가 포함 된 별도의 창을 열어야하는 상황이 발생했습니다. 하지만이 새로운 창을 만드는 방법을 알아낼 수 없습니다. 아무도 나에게 하나를 만드는 방법의 예를 들어 줄 수 있습니까?

해결법

  1. ==============================

    1.미친 듯이 움직일 수있는 흔한 오류는 생성 한 팝업 창의 핸들을 (예 : 메인 창의 데이터 멤버에서) 살아남을 수있는 일부 파이썬 변수에 저장하는 것을 잊어 버리는 것입니다.

    미친 듯이 움직일 수있는 흔한 오류는 생성 한 팝업 창의 핸들을 (예 : 메인 창의 데이터 멤버에서) 살아남을 수있는 일부 파이썬 변수에 저장하는 것을 잊어 버리는 것입니다.

    다음은 버튼이있는 메인 윈도우를 만드는 간단한 프로그램으로, 버튼을 누르면 팝업이 열립니다

    #!/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 (...))를 수행 할 수 있습니다. 그렇게하면 여러 개의 팝업을 열 수 있습니다.

  2. ==============================

    2.일반적으로 someQWidget.show ()와 함께 여러 개의 parentless 창을 표시합니다.

    일반적으로 someQWidget.show ()와 함께 여러 개의 parentless 창을 표시합니다.

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

    하지만 가장 가능성이 높습니다. 모달 표준 Dialog를 원합니다. 또한 모달 대화 상자를 이해해야합니다.

  3. from https://stackoverflow.com/questions/4838890/python-pyqt-popup-window by cc-by-sa and MIT license