PYQT:打开第二个和第三个窗口时,主窗口关闭

时间:2018-11-15 12:04:27

标签: python-3.x pyqt pyqt5

我需要解决当前的问题。

我有一个带有三个按钮的窗口。当按下其中两个(“ GraphicButton”和“ QuestionButton”)时,将打开第二个和第三个窗口。这很好。第三个按钮“ ImportButton”用于用来自excel的数据框填充主窗口中的表小部件。 当我按下“ ImportButton”时,一切正常。

但是,当我先按其他按钮之一打开其他窗口,然后按“导入按钮”时,主窗口和其他窗口将关闭。

我可以在这里使用一些建议。 这是我的main.py代码:

import sys
import pandas as pd
import os
from qtpy import QtWidgets, QtCore, QtGui

from ui.mainwindow import Ui_MainWindow
from ui.graphwindow import Ui_GraphWindow
from ui.questionwindow import Ui_QuestionWindow

app = QtWidgets.QApplication(sys.argv)

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent = None):
        super().__init__(parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.setWindowTitle("Test")

        self.ui.ImportButton.clicked.connect(self.import_clicked)
        self.ui.GraphicButton.clicked.connect(self.graphic_clicked)
        self.ui.QuestionButton.clicked.connect(self.question_clicked)

    def import_clicked(self):
        self.ui.RefWidget.setSortingEnabled(False)
        self.ui.LubWidget.setSortingEnabled(False)
        self.ui.MixWidget.setSortingEnabled(False)

        self.ui.RefWidget.setRowCount(0)
        self.ui.LubWidget.setRowCount(0)
        self.ui.MixWidget.setRowCount(0)

        if self.ui.RefBoxC.currentIndex() == 0:
            A = os.path.join(os.path.dirname(__file__),"./Datenbank/CO2.xlsx")
            df = pd.read_excel(A)

            self.ui.RefWidget.setColumnCount(len(df.columns))
            self.ui.RefWidget.setRowCount(len(df.index))

            for i in range(len(df.index)):
                for j in range(len(df.columns)):
                    self.ui.RefWidget.setItem(i, j, QtWidgets.QTableWidgetItem(str(df.iat[i, j])))

            self.ui.RefWidget.resizeColumnsToContents()
            self.ui.RefWidget.resizeRowsToContents()
        else:
            A = os.path.join(os.path.dirname(__file__), "./Datenbank/PlatzhalterRef.xlsx")
            df = pd.read_excel(A)

            self.ui.RefWidget.setColumnCount(len(df.columns))
            self.ui.RefWidget.setRowCount(len(df.index))

            for i in range(len(df.index)):
                for j in range(len(df.columns)):
                    self.ui.RefWidget.setItem(i, j, QtWidgets.QTableWidgetItem(str(df.iat[i, j])))

            self.ui.RefWidget.resizeColumnsToContents()
            self.ui.RefWidget.resizeRowsToContents()

        self.ui.RefWidget.setSortingEnabled(True)
        self.ui.LubWidget.setSortingEnabled(True)
        self.ui.MixWidget.setSortingEnabled(True)

    def graphic_clicked(self):
        self.Gwindow = QtWidgets.QMainWindow()
        self.ui = Ui_GraphWindow()
        self.ui.setupUi(self.Gwindow)
        self.Gwindow.show()

    def question_clicked(self):
        self.Questwindow = QtWidgets.QMainWindow()
        self.ui = Ui_QuestionWindow()
        self.ui.setupUi(self.Questwindow)
        self.Questwindow.show()

window = MainWindow()
window.show()

sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:0)

免责声明:此答案提供的解决方案尚未经过测试,可能不完整。

单击GraphicButtonQuestionButton时,

self.ui = Ui_GraphWindow()

self.ui = Ui_QuestionWindow()

这将修改self.ui。单击ImportButton时,self.ui将引用其他窗口。我相信这是无意

运行import_clicked()中的命令时,可能会引用未定义的类,小部件等。

self.ui.RefWidget.setSortingEnabled(False)

我猜RefWidget没有在Ui_QuestionWindow或Ui_GraphWindow中定义。

要解决此问题,请尝试添加

def import_clicked(self):
    self.ui = Ui_MainWindow()   # set self.ui to refer to a MainWindow
    # ...

,看看是否可行。 (警告:可能会创建一个新的MainWindow并将旧的MainWindow丢掉。同样,我还没有进行测试以查看它是否确实创建了一个新的MainWindow,但是直觉告诉我确实如此。)

编辑:删除线中的上述建议对OP无效。

如果进一步遇到麻烦和混乱,请考虑使用三个单独的成员变量,而不是单个self.ui

def __init__(self, parent = None):
    super().__init__(parent)

    self.uiMain = Ui_MainWindow()              # new member variable: self.uiMain
    # ...

def import_clicked(self):   

    self.uiMain.RefWidget.setSortingEnabled(False)
    self.uiMain.LubWidget.setSortingEnabled(False)
    self.uiMain.MixWidget.setSortingEnabled(False)
    # ...

def graphic_clicked(self):
    self.Gwindow = QtWidgets.QMainWindow()
    self.uiGraphic = Ui_GraphWindow()          # new member variable: self.uiGraphic
    # ...

def question_clicked(self):
    self.Questwindow = QtWidgets.QMainWindow()
    self.uiQuestion = Ui_QuestionWindow()      # new member variable: self.uiQuestion
    # ...