Lxix69
Lxix69

Reputation: 63

How do i open second window and then hide it?

I need a program to open a new window from main window. After some research i found how to do it, now im able to open another window from the first one.The problem comes when i want to hide the second window and go back to the first one.I tried self.hide() , self.close() , self.terminate(), self.destroy().

All of them just close the second window aswell as the first one.How can i only close the second one but switch to the first one again.I need this for a settings screen.I click a button it opens settings window , you change some settings and click done.After that i would like it to come back to first window but it just closes both.

This is my code so far :

main.py:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'E:\Hacking\Hackovi\MCheat 2.0\main.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!

from AutoBowGUI import Ui_Form
from PyQt5 import QtCore, QtGui, QtWidgets
import configparser

parser = configparser.ConfigParser()
parser.read('Config.ini')

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(188, 137)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.ChatResponderB = QtWidgets.QPushButton(self.centralwidget)
        self.ChatResponderB.setGeometry(QtCore.QRect(30, 10, 101, 31))
        self.ChatResponderB.setObjectName("ChatResponderB")
        self.ChatResponderC = QtWidgets.QCheckBox(self.centralwidget)
        self.ChatResponderC.setGeometry(QtCore.QRect(10, 20, 70, 17))
        self.ChatResponderC.setText("")
        self.ChatResponderC.setObjectName("ChatResponderC")
        self.AutoClickerB = QtWidgets.QPushButton(self.centralwidget)
        self.AutoClickerB.setGeometry(QtCore.QRect(30, 50, 101, 31))
        self.AutoClickerB.setObjectName("AutoClickerB")
        self.AutoClickerC = QtWidgets.QCheckBox(self.centralwidget)
        self.AutoClickerC.setGeometry(QtCore.QRect(10, 60, 70, 17))
        self.AutoClickerC.setText("")
        self.AutoClickerC.setObjectName("AutoClickerC")
        self.AutoBowB = QtWidgets.QPushButton(self.centralwidget)
        self.AutoBowB.setGeometry(QtCore.QRect(30, 90, 101, 31))
        self.AutoBowB.setObjectName("AutoBowB")
        self.AutoBowC = QtWidgets.QCheckBox(self.centralwidget)
        self.AutoBowC.setGeometry(QtCore.QRect(10, 100, 70, 17))
        self.AutoBowC.setText("")
        self.AutoBowC.setObjectName("AutoBowC")
        self.ChatResponderO = QtWidgets.QPushButton(self.centralwidget)
        self.ChatResponderO.setGeometry(QtCore.QRect(130, 10, 31, 31))
        self.ChatResponderO.setObjectName("ChatResponderO")
        self.AutoClickerO = QtWidgets.QPushButton(self.centralwidget)
        self.AutoClickerO.setGeometry(QtCore.QRect(130, 50, 31, 31))
        self.AutoClickerO.setObjectName("AutoClickerO")
        self.AutoBowO = QtWidgets.QPushButton(self.centralwidget)
        self.AutoBowO.setGeometry(QtCore.QRect(130, 90, 31, 31))
        self.AutoBowO.setObjectName("AutoBowO")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        self.AutoBowO.clicked.connect(self.AutoBowOptions)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def AutoBowOptions(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_Form()
        self.ui.setupUi(self.window)
        self.window.show()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MCheat"))
        self.ChatResponderB.setText(_translate("MainWindow", "Chat Responder"))
        self.AutoClickerB.setText(_translate("MainWindow", "AutoClicker"))
        self.AutoBowB.setText(_translate("MainWindow", "AutoBow"))
        self.ChatResponderO.setText(_translate("MainWindow", "..."))
        self.AutoClickerO.setText(_translate("MainWindow", "..."))
        self.AutoBowO.setText(_translate("MainWindow", "..."))


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

AutoBowGUI.py:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'AutoBowGUI.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets
import configparser
import time
config = configparser.ConfigParser()
config.read('Config.ini')

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(220, 130)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(60, 100, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWidgets.QLineEdit(Form)
        self.lineEdit.setGeometry(QtCore.QRect(90, 10, 111, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(10, 10, 71, 16))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(10, 40, 71, 16))
        self.label_2.setObjectName("label_2")
        self.lineEdit_2 = QtWidgets.QLineEdit(Form)
        self.lineEdit_2.setGeometry(QtCore.QRect(90, 40, 41, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.lineEdit_3 = QtWidgets.QLineEdit(Form)
        self.lineEdit_3.setGeometry(QtCore.QRect(160, 40, 41, 20))
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.lineEdit_4 = QtWidgets.QLineEdit(Form)
        self.lineEdit_4.setGeometry(QtCore.QRect(90, 70, 41, 20))
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(10, 70, 71, 16))
        self.label_3.setObjectName("label_3")
        self.lineEdit_5 = QtWidgets.QLineEdit(Form)
        self.lineEdit_5.setGeometry(QtCore.QRect(160, 70, 41, 20))
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.label_4 = QtWidgets.QLabel(Form)
        self.label_4.setGeometry(QtCore.QRect(140, 40, 16, 16))
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(140, 70, 16, 16))
        self.label_5.setObjectName("label_5")
        self.pushButton.clicked.connect(self.done)
        self.lineEdit.setText(str(config.get("AutoBow", "drawdelay")))
        self.lineEdit_2.setText(str(config.get("AutoBow", "start1")))
        self.lineEdit_3.setText(str(config.get("AutoBow", "start2")))
        self.lineEdit_4.setText(str(config.get("AutoBow", "pause1")))
        self.lineEdit_5.setText(str(config.get("AutoBow", "pause2")))

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
    def done(self, From):
        config.set("AutoBow", "drawdelay", self.lineEdit.text())
        config.set("AutoBow", "start1", self.lineEdit_2.text())
        config.set("AutoBow", "start2", self.lineEdit_3.text())
        config.set("AutoBow", "pause1", self.lineEdit_4.text())
        config.set("AutoBow", "pause2", self.lineEdit_5.text())
        with open('Config.ini', 'w') as configfile:
            config.write(configfile)
        time.sleep(0.5)
        self.close()
    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "AutoBow"))
        self.pushButton.setText(_translate("Form", "Done"))
        self.label.setText(_translate("Form", "Draw Delay"))
        self.label_2.setText(_translate("Form", "Start Keybind"))
        self.label_3.setText(_translate("Form", "Pause Keybind"))
        self.label_4.setText(_translate("Form", "+"))
        self.label_5.setText(_translate("Form", "+"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

As for now my program is able to do following:

  1. Show first window.
  2. By clicking a button shows second window.
  3. By clicking "done" saves options to config file.
  4. By clicking "done" closes second window but first one stays open. (missing)

Upvotes: 0

Views: 178

Answers (1)

eyllanesc
eyllanesc

Reputation: 243887

You should not modify the class generated by Qt Designer since it can generate problems, for more information read 1 and 2.

If you want a window that is used to configure some parameters then you must use QDialog so I recommend that when you build "AutoBowGUI.ui" you use that template as a base. And when you want to close the window use accept() or reject() so you can use the exec_() method.

Do not use time.sleep in the main GUI thread, if you want to perform a task after a certain time then you must use QTimer.singleShot().

I recommend using layouts to position the widgets inside the window.

The complete example is in this link.

Upvotes: 1

Related Questions