python - 如何显示已经运行的 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_())
解决方案
推荐阅读
- c++ - MFC UDS_WRAP 样式不适用于自旋控制
- html - 如何自定义设计选择选项卡?
- express - 提供静态文件时 ExpressJS 出错 - 由于 MIME 类型(“text/html”)不匹配,资源被阻止
- ios - 在 iOS 中使用相机检测对象并使用 ARKit 定位 3D 对象
- angular - 我可以在 [ngClass] 中使用条件(三元)运算符以及 Angular2 中的多个类条件吗?
- java - 是否可以在用 Python 编写的 Dataflow 流式管道中导入 Java 方法 `wrapBigQueryInsertError`?
- javascript - 在无头 Node JS 脚本中运行 Brain JS
- bash - 未使用 Shell 脚本变量
- c# - 事件处理在我的 asp.net Web 表单 Web 应用程序中不起作用
- c# - 使用 AAD 身份验证从具有 MSI 的应用服务向另一个应用服务 API 发出 HTTP 请求