为什么在Python中运行其他窗口(GUI)时,其他窗口(GUI)无法打开?

时间:2019-09-03 10:22:16

标签: python user-interface pyqt5

我有一个场景,其中一个窗口正在python Pyqt5中运行。我希望当某些事件发生时,另一个窗口也打开。

我写了一个我认为应该可以正常运行的代码,但是当事件打开其他GUI时,出现错误。 我的代码:

class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        app = QApplication(sys.argv)
        win = QWidget()

        l1 = QLabel("URL:")
        url = QLineEdit()
        l3 = QLabel("Wait (sec):")
        wait = QLineEdit()
        l2 = QLabel("Iteration:")
        l2.move(20,100)
        global add1
        count = QLineEdit()
        fbox = QFormLayout()
        fbox.addRow(l1, url)
        fbox.addRow(l3, wait)
        vbox = QVBoxLayout()

        vbox.addWidget(count)
        fbox.addRow(l2, vbox)
        startButton=QPushButton("Start")

        fbox.addRow(startButton)
        startButton.clicked.connect(self.requests)
        win.setLayout(fbox)

        win.setWindowTitle("--")
        win.resize(300,200)
        win.show()
        sys.exit(app.exec_())

    def requests(self):

        for x in range(0,int(count.text())):
            //certain event happens here, which will cause other window to get open         
             self.dialog = PopUp(self)
             self.dialog.show()

    def stop(self):
        sys.exit()

class PopUp(QMainWindow):

    def __init__(self, parent=None):
        super(PopUp, self).__init__(parent)
        app = QApplication(sys.argv)
        win = QWidget()

        l1 = QLabel("URL:")
        nextUrl = QLineEdit()

        fbox = QFormLayout()
        fbox.addRow(l1, url)

        startButton = QPushButton("Go")

        fbox.addRow(startButton)
        startButton.clicked.connect(self.requests)
        win.setLayout(fbox)

        win.setWindowTitle("--")
        win.resize(300, 200)
        win.show()
        sys.exit(app.exec_())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

我看到该代码是正确的,但是出现一个未知错误: QCoreApplication::exec: The event loop is already running 我已经在google上搜索过,并且这里出现了堆栈溢出,但没有得到任何有价值的信息。任何人都知道为什么会出现此错误,以及为什么它会出现在我的代码中?

1 个答案:

答案 0 :(得分:1)

每个PyQt5应用程序必须创建一个应用程序对象app = QApplication(sys.argv)。从class MainWindowclass PopUp-app = QApplication (sys.argv)中删除。

sys.exit(app.exec_())-应用程序的主循环,他还必须一个人。从class MainWindowclass PopUp-sys.exit(app.exec_())

中删除

我提高了示例的可读性。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore    import *
from PyQt5.QtGui     import *
from PyQt5.QtWidgets import *


class PopUp(QMainWindow):
    def __init__(self, x, url, parent=None):
        super(PopUp, self).__init__(parent)

        self.url = url.text()
        self.x   = x + 1

        self.setWindowTitle("-- PopUp {}  --".format(self.x))
        self.setGeometry(self.x*100, self.x*100, 300, 200)

        win = QWidget()
        self.setCentralWidget(win)

        nextUrl = QLineEdit(self.url)
        self.startButton = QPushButton("Go {}".format(self.x))

        fbox = QFormLayout(win)
        fbox.addRow(QLabel("URL:"), nextUrl)
        fbox.addRow(self.startButton)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.dialogs = []
        self.flag    = False

        win = QWidget()
        self.setCentralWidget(win)

        self.url    = QLineEdit()                           # + self
        wait        = QLineEdit()
        self.count  = QLineEdit()                           # + self
        startButton = QPushButton("Start")
        startButton.clicked.connect(self.requests)

        fbox = QFormLayout(win)         
        fbox.addRow(QLabel("URL:"),        self.url)
        fbox.addRow(QLabel("Wait (sec):"), wait)
        fbox.addRow(QLabel("Iteration:"),  self.count)        
        fbox.addRow(startButton)

    def requests(self):
        if self.dialogs and self.flag:
            _ = [ i.hide() for i in self.dialogs]
            self.dialogs = []

        for x in range(0, int(self.count.text())):             
            # certain event happens here, which will cause other window to get open         
            dialog = PopUp(x, self.url, self)
            dialog.startButton.clicked.connect(self.requests2)
            dialog.show()

            self.dialogs.append(dialog)
        self.flag = True    

    def stop(self):   # ?
        sys.exit()

    def requests2(self):    
        print("def requests2(self): clicked Button {}".format(self.sender().text()))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainWindow()
    main.setWindowTitle("-- Title --")
    main.resize(300,200)    
    main.show()
    sys.exit(app.exec_())

enter image description here