-1

I have small code in pyqt5 which is about showing first window and after button click showing second window, some manipulations are done over widgets but everything works except one thing, at the end second window disappears T

I tried some modifications over the code also checked some posts here but nothing worked

import sys

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QLineEdit

from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAction, QTableWidget, QTableWidgetItem, QVBoxLayout
from qtpy import QtWidgets

app = QtWidgets.QApplication(sys.argv)
MainWind = QtWidgets.QMainWindow()


class Ui_LoginWindow(object):
    def setupUi(self, LoginWindow):
        LoginWindow.setObjectName("LoginWindow")
        LoginWindow.resize(418, 508)
        self.LoginWidget = QtWidgets.QWidget(LoginWindow)
        self.LoginWidget.setObjectName("LoginWidget")
        self.User_Input = QtWidgets.QLineEdit(self.LoginWidget)
        self.User_Input.setGeometry(QtCore.QRect(100, 100, 201, 41))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.User_Input.setFont(font)
        self.User_Input.setObjectName("User_Input")
        self.Password_Input = QtWidgets.QLineEdit(self.LoginWidget)
        self.Password_Input.setGeometry(QtCore.QRect(100, 220, 201, 41))
        self.Password_Input.setEchoMode(QLineEdit.Password)
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setStrikeOut(False)
        self.Password_Input.setFont(font)
        self.Password_Input.setInputMask("")
        self.Password_Input.setText("")
        self.Password_Input.setObjectName("Password_Input")
        self.User_Label = QtWidgets.QLabel(self.LoginWidget)
        self.User_Label.setGeometry(QtCore.QRect(140, 70, 125, 21))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.User_Label.setFont(font)
        self.User_Label.setAlignment(QtCore.Qt.AlignCenter)
        self.User_Label.setObjectName("User_Label")
        self.Password_Label = QtWidgets.QLabel(self.LoginWidget)
        self.Password_Label.setEnabled(True)
        self.Password_Label.setGeometry(QtCore.QRect(160, 190, 91, 21))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.Password_Label.setFont(font)
        self.Password_Label.setScaledContents(False)
        self.Password_Label.setAlignment(QtCore.Qt.AlignCenter)
        self.Password_Label.setObjectName("Password_Label")
        self.Login_Button = QtWidgets.QPushButton(self.LoginWidget)
        self.Login_Button.setGeometry(QtCore.QRect(120, 310, 165, 29))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.Login_Button.setFont(font)
        self.Login_Button.setObjectName("Login_Button")
        self.Message_Label = QtWidgets.QLabel(self.LoginWidget)
        self.Message_Label.setGeometry(QtCore.QRect(20, 420, 371, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setItalic(True)
        self.Message_Label.setFont(font)
        self.Message_Label.setAlignment(QtCore.Qt.AlignCenter)
        self.Message_Label.setWordWrap(True)
        self.Message_Label.setObjectName("Message_Label")
        LoginWindow.setCentralWidget(self.LoginWidget)

        self.retranslateUi(LoginWindow)
        QtCore.QMetaObject.connectSlotsByName(LoginWindow)

    def retranslateUi(self, LoginWindow):
        _translate = QtCore.QCoreApplication.translate
        LoginWindow.setWindowTitle(_translate("LoginWindow", "მთავარი გვერდი"))
        self.User_Label.setText(_translate("LoginWindow", "მომხმარებელი"))
        self.Password_Label.setText(_translate("LoginWindow", "პაროლი"))
        self.Login_Button.setText(_translate("LoginWindow", "სისტემაში შესვლა"))
        self.Message_Label.setText(_translate("LoginWindow", "<html><head/><body><p><br/></p></body></html>"))
        self.Login_Button.clicked.connect(self.log_click)

    def log_click(self):

        MainWind.hide()
        Second()

################################################
#This is where it starts does some work and disappears at the end
class Second(QWidget):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)
        self.setWindowTitle('შეიყვანე ჩვენება')
        self.setGeometry(0, 0, 640, 480)

        self.tableWidget = QTableWidget()

        grid_height = 4
        grid_width = 3

        self.tableWidget.setRowCount(grid_height)
        self.tableWidget.setColumnCount(grid_width)

        for x in range(0, grid_height):
            for y in range(0, grid_width):

                self.tableWidget.setItem(x, y, QTableWidgetItem('test1'))
                self.tableWidget.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tableWidget)
        self.setLayout(self.layout)

        self.show()


def Login_Page():
    ui = Ui_LoginWindow()
    ui.setupUi(MainWind)
    MainWind.show()
    sys.exit(app.exec_())


def main():
    Login_Page()


if __name__ == "__main__":
    main()

Just want second window to remain still

1 Answers1

1

Just replace this line:

Second()

By this:

self.second = Second()

It's a common problem, python (its garbage collector) deletes the new window as soon as it's created, because there is no more reference to it. Storing it as a class attribute solves the problem.

Also, it's a good practice to move the show() method outside of the __init__ of your Second class, because you may want to instantiate a Second() object without wanting to show it, for testing purposes for example.

olinox14
  • 5,652
  • 2
  • 19
  • 36