首页 > 解决方案 > 如何显示已经运行的 PyQt5 应用程序的窗口?自我展示()

问题描述

我有一个应用程序,其中几个窗口已经在工作,但我并不真正理解这个概念。我有一个带有 QPushButton 的窗口:

 self.ui.btn.clicked.connect(self.btn_clicked)

下面的代码,如果单独使用,效果非常好。(显示图表的示例)

import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
from PyQt5 import QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar


class ScrollableWindow(QtWidgets.QMainWindow):
    def __init__(self, fig):
        self.qapp = QtWidgets.QApplication([])

        QtWidgets.QMainWindow.__init__(self)
        self.widget = QtWidgets.QWidget()
        self.setCentralWidget(self.widget)
        self.widget.setLayout(QtWidgets.QVBoxLayout())
        self.widget.layout().setContentsMargins(0,0,0,0)
        self.widget.layout().setSpacing(0)

        self.fig = fig
        self.canvas = FigureCanvas(self.fig)
        self.canvas.draw()
        self.scroll = QtWidgets.QScrollArea(self.widget)
        self.scroll.setWidget(self.canvas)

        self.nav = NavigationToolbar(self.canvas, self.widget)
        self.widget.layout().addWidget(self.nav)
        self.widget.layout().addWidget(self.scroll)

        self.show()
        exit(self.qapp.exec_())


# create a figure and some subplots
fig, axes = plt.subplots(ncols=4, nrows=5, figsize=(16,16))
for ax in axes.flatten():
    ax.plot([2,3,5,1])

# pass the figure to the custom window
a = ScrollableWindow(fig)

我想做的是把这段代码放在我的函数中

def btn_clicked(self):
   # here copy this nice code

单击按钮后显示图表。

但显然,exit(self.qapp.exec_())不能使用,否则会出现常见错误:

QCoreApplication::exec: 事件循环已经在运行

所以我删除了那行代码,但它也不起作用。在这里我不明白为什么。我的应用程序已经在运行,MainWindow 正常显示,为什么不使用exec_()就不能显示其他窗口

self.show()理论上应该显示图表不是吗?我究竟做错了什么?感谢大家。

为了提供一个所有人都可以使用的非常简单的应用程序示例,我将这个 pyqt5 代码与 1 个 PushButton 结合在一起。

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(437, 239)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btn = QtWidgets.QPushButton(self.centralwidget)
        self.btn.setGeometry(QtCore.QRect(140, 60, 151, 41))
        self.btn.setObjectName("btn")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.btn.setText(_translate("MainWindow", "PushButton"))
        self.btn.clicked.connect(self.btn_clicked)

    def btn_clicked(self):
        # here I would like to use the code from above to show a graph



if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

标签: pythonpyqt5

解决方案


推荐阅读