Как открыть второе окно, а затем скрыть его? - PullRequest
0 голосов
/ 22 февраля 2020

Мне нужна программа, чтобы открыть новое окно из главного окна. После некоторых исследований я нашел, как это сделать, и теперь я могу открыть другое окно из первого. Проблема возникает, когда я хочу спрятать второе окно и go вернуться к первому. Я попытался self.hide(), self.close(), self.terminate(), self.destroy().

Все они просто закрывают второе окно так же, как и первое. Как я могу только закрыть второе окно, но снова переключиться на первое. Мне нужно это для экрана настроек. Я нажимаю кнопку, она открывает окно настроек, вы меняете некоторые настройки и нажимаете «Готово». После этого я бы хотел, чтобы он вернулся в первое окно, но он просто закрывает оба.

Это мой код на данный момент:

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_())

AutoBow GUI .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_())

На данный момент моя программа может выполнять следующие действия:

  1. Показать первое окно.
  2. При нажатии кнопки открывается второе окно.
  3. При нажатии «готово» сохраняет параметры в файле конфигурации.
  4. By нажатие «Готово» закрывает второе окно, но первое остается открытым. (отсутствует)

1 Ответ

1 голос
/ 22 февраля 2020

Вы не должны изменять класс, сгенерированный Qt Designer, поскольку он может создавать проблемы, для получения дополнительной информации читайте 1 и 2 .

Если вы хотите окно это используется для настройки некоторых параметров, тогда вы должны использовать QDialog, поэтому я рекомендую, чтобы при сборке «AutoBow GUI .ui» вы использовали этот шаблон в качестве основы. А когда вы хотите закрыть окно, используйте accept () или reject (), чтобы вы могли использовать метод exec_ ().

Не используйте time.sleep в главном потоке GUI, если вы хотите выполнить задание через определенное время, затем вы должны использовать QTimer.singleShot ().

Я рекомендую использовать макеты для размещения виджетов внутри окна.

Полный пример приведен в this ссылка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...