PYQT: главное окно закрывается, когда открыто второе и третье окна - PullRequest
0 голосов
/ 15 ноября 2018

Мне нужна помощь в решении текущей проблемы.

У меня есть окно с тремя кнопками.При нажатии двух из них («GraphicButton» и «QuestionButton») открывается второе и третье окно.Это отлично работает.Третья кнопка «ImportButton» предназначена для заполнения виджета таблицы в главном окне кадром данных из Excel.Когда я нажимаю «ImportButton» сначала все работает нормально.

НО, когда я сначала нажимаю одну из других кнопок, чтобы открыть другие окна, а затем нажимаю кнопку «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 голосов
/ 15 ноября 2018

Отказ от ответственности: решение, предоставленное этим ответом, не было проверено и может быть неполным.

При нажатии кнопки GraphicButton или QuestionButton,

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
    # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...