无法在不关闭主图 window 的情况下关闭新图 window

Unable to close the new graph window without closing the main window

我正在 Python 中使用 GUI 库 - PyQt5 进行 OS 作业调度算法的可视化项目。 单击生成图形按钮,我想在新 window 中显示一个图形。 我已尝试实施,但 问题是我无法在不关闭主 window 的情况下关闭其中显示图表的新 window。 下面是我实现的代码。

主程序文件 - ProcessScheduler.py

`

# importing required libs

class Ui_MainWindow(object):

    # declaring global variables

    # Importing all the functions from other modules
    from src.Buttons.Plot import graphBtnHandler
    
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowModality(QtCore.Qt.ApplicationModal)
        MainWindow.resize(1280, 687)
        MainWindow.setMaximumSize(1280, 687)
        # GUI setup
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate(
            "MainWindow", "Process Scheduler"))
        # GUI setup    
        # Adding Handler on Generate Graph button.
        self.GraphBtn.clicked.connect(self.graphBtnHandler)

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

`

**Plot.py** - where the graph plot code is written

`

# importing required libs

def graphBtnHandler(self):

    fig, ax = plt.subplots()

    # setting up the graph ploting details
    
    plt.show(block=False)

`

这是应用程序主图 window 和图表 window 的图片。

  1. 主要Window:

  2. 图表Window:

您可以在图中看到 Window 关闭按钮已禁用。它只有在关闭主 window.

后才会启用

您已将 window 的 windowModality 设置为 ApplicationModal,这意味着它将阻止与 任何其他 的任何交互widget/window 直到它关闭。

简单的解决方案是从您的代码中删除该行。

如果您使用 Designer,正确的 解决方案是在 Designer 中打开 ui 文件,取消设置 属性,保存文件,使用 pyuic 重新创建 ui 文件并且 不再修改它 ,而是按照关于 using Designer 的官方文档中的建议将其用作模块.使用 pyuic 创建的文件应该 永远不会 被修改(你也不应该试图模仿它们的行为)。

除此之外,在 class 中导入函数以将其用作实例方法并不是一个好方法。