无法在不关闭主图 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 的图片。
主要Window:
图表Window:
您可以在图中看到 Window 关闭按钮已禁用。它只有在关闭主 window.
后才会启用
您已将 window 的 windowModality 设置为 ApplicationModal
,这意味着它将阻止与 任何其他 的任何交互widget/window 直到它关闭。
简单的解决方案是从您的代码中删除该行。
如果您使用 Designer,正确的 解决方案是在 Designer 中打开 ui 文件,取消设置 属性,保存文件,使用 pyuic 重新创建 ui 文件并且 不再修改它 ,而是按照关于 using Designer 的官方文档中的建议将其用作模块.使用 pyuic 创建的文件应该 永远不会 被修改(你也不应该试图模仿它们的行为)。
除此之外,在 class 中导入函数以将其用作实例方法并不是一个好方法。
我正在 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 的图片。
主要Window:
图表Window:
您可以在图中看到 Window 关闭按钮已禁用。它只有在关闭主 window.
后才会启用您已将 window 的 windowModality 设置为 ApplicationModal
,这意味着它将阻止与 任何其他 的任何交互widget/window 直到它关闭。
简单的解决方案是从您的代码中删除该行。
如果您使用 Designer,正确的 解决方案是在 Designer 中打开 ui 文件,取消设置 属性,保存文件,使用 pyuic 重新创建 ui 文件并且 不再修改它 ,而是按照关于 using Designer 的官方文档中的建议将其用作模块.使用 pyuic 创建的文件应该 永远不会 被修改(你也不应该试图模仿它们的行为)。
除此之外,在 class 中导入函数以将其用作实例方法并不是一个好方法。