为啥其他窗口(GUI)没有打开,而其他窗口(GUI)在 Python 中运行?

Posted

技术标签:

【中文标题】为啥其他窗口(GUI)没有打开,而其他窗口(GUI)在 Python 中运行?【英文标题】:Why other window(GUI) is not opening while other window(GUI) is running in Python?为什么其他窗口(GUI)没有打开,而其他窗口(GUI)在 Python 中运行? 【发布时间】:2019-09-03 10:22:16 【问题描述】:

我有一个场景在 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 我在谷歌和这里的堆栈溢出中搜索过,但没有得到任何有价值的东西。任何人都知道为什么会出现这个错误以及为什么会出现在我的代码中??

【问题讨论】:

每个 PyQt5 应用程序必须创建一个应用程序对象app = QApplication(sys.argv)。从 class MainWindowclass PopUp - app = QApplication (sys.argv) 中删除。 sys.exit(app.exec_()) - 应用程序的主循环,他也必须是一个人。从class MainWindowclass PopUp - sys.exit(app.exec_()) 中删除。 @S.Nick 谢谢你的指导。但是从两个类中删除这两个东西并不能打开正确的 GUI。结果中只打开了一个空白窗口。 点击“开始”按钮时应该打开多少个窗口? 【参考方案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_())

【讨论】:

self.dialog 更改为 dialog。您不会在循环中创建类属性 @eyllanesc 谢谢,已修复。

以上是关于为啥其他窗口(GUI)没有打开,而其他窗口(GUI)在 Python 中运行?的主要内容,如果未能解决你的问题,请参考以下文章

Gtkmm 从课堂外关闭一个 gui 窗口

gui - tkinter 开发

如何停止运行没有 GUI 窗口的 Python .pyw 脚本?

在 PySimpleGUI 窗口中自动更新 Matplotlib 图

如何在 GUI 输出窗口而不是 Visual Studio 2015 中的 cmd 控制台上显示我的 C++ 程序输出?

QT开发——窗口组件和窗口类型