Уничтожьте все Дочерние окна

#python #pyqt5

Вопрос:

В настоящее время я создаю игру на основе учебника с pyqt5, и я использую конструктор для создания окон, потому что это было проще, все было хорошо, пока я не попытался выяснить, как уничтожить одно дочернее окно.Я нашел несколько ответов, но это не соответствовало моей ситуации (или я просто плохо разбираюсь в этом).

Примечание: Я использую конструктор для создания пользовательского интерфейса

Проблема: Не удалось найти ответ на мою проблему, которая заключается в уничтожении дочернего окна (HuntTab), когда Hp меньше 1

 import random
from PyQt5 import QtCore, QtGui, QtWidgets


level = 1
job = "NONE"

df = random.randrange(1, 6, 1)

hpMax = random.randrange(95, 120, 1)
hp = hpMax

exp = 0
expMax = 100

attackMax = random.randrange(4, 7, 1)
attackMin = random.randrange(1, 4, 1)

enemyLevel = random.randrange(1, 4, 1)
enemyHp = enemyLevel * 20   20
enemyAttackMax = random.randrange(2, 4, 1) * enemyLevel
enemyAttackMin = random.randrange(1, 3, 1) * enemyLevel

luck = 10
looks = 120


class UiMainWindow(object):
    UI = f"<html><head/><body><p>Level: {level}</p><p>Job: {job}</p><p>Health: {hp}</p><p>Attack: {attackMin} - {attackMax}</p><p>Defense: {df}</p><p>Luck: {luck}</p><p>Looks: {looks}</p><p><br/></p></body></html>"

    def __init__(self, theMainWindow):
        super(UiMainWindow, self).__init__()
        self.HuntTab = QtWidgets.QWidget()
        self.uiHunt = UiHuntTab(self.HuntTab)
        self.centralwidget = QtWidgets.QWidget(theMainWindow)
        self.MainWindow = theMainWindow
        self.statusbar = QtWidgets.QStatusBar(theMainWindow)
        self.menubar = QtWidgets.QMenuBar(theMainWindow)
        self.Love = QtWidgets.QPushButton(self.centralwidget)
        self.Life = QtWidgets.QPushButton(self.centralwidget)
        self.Rule = QtWidgets.QPushButton(self.centralwidget)
        self.Hunt = QtWidgets.QPushButton(self.centralwidget)
        self.Fight = QtWidgets.QPushButton(self.centralwidget)
        self.Shop = QtWidgets.QPushButton(self.centralwidget)
        self.MainOutput = QtWidgets.QLabel(self.centralwidget)
        self.iniUI()

    def iniUI(self):
        self.Hunt.clicked.connect(self.CallHutTab)

    def CallHutTab(self):
        self.uiHunt.setupUi(self.HuntTab)
        self.HuntTab.show()

    def setupUi(self, theMainWindow):
        theMainWindow.setObjectName("MainWindow")
        theMainWindow.resize(519, 404)
        self.centralwidget.setObjectName("centralwidget")
        self.MainOutput.setGeometry(QtCore.QRect(40, 30, 131, 171))
        self.MainOutput.setIndent(0)
        self.MainOutput.setObjectName("MainOutput")
        self.Shop.setGeometry(QtCore.QRect(40, 230, 141, 51))
        self.Shop.setObjectName("Shop")
        self.Fight.setGeometry(QtCore.QRect(190, 230, 141, 51))
        self.Fight.setObjectName("Fight")
        self.Hunt.setGeometry(QtCore.QRect(340, 230, 141, 51))
        self.Hunt.setObjectName("Hunt")
        self.Rule.setGeometry(QtCore.QRect(190, 290, 141, 51))
        self.Rule.setObjectName("Rule")
        self.Life.setGeometry(QtCore.QRect(340, 290, 141, 51))
        self.Life.setObjectName("Life")
        self.Love.setGeometry(QtCore.QRect(40, 290, 141, 51))
        self.Love.setObjectName("Love")
        theMainWindow.setCentralWidget(self.centralwidget)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 519, 21))
        self.menubar.setObjectName("menubar")
        theMainWindow.setMenuBar(self.menubar)
        self.statusbar.setObjectName("statusbar")
        theMainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, theMainWindow):
        _translate = QtCore.QCoreApplication.translate
        theMainWindow.setWindowTitle(_translate("MainWindow", "Fight"))
        self.MainOutput.setText(_translate("MainWindow", self.UI))
        self.Shop.setText(_translate("MainWindow", "Shop"))
        self.Fight.setText(_translate("MainWindow", "Fight"))
        self.Hunt.setText(_translate("MainWindow", "Hunt"))
        self.Rule.setText(_translate("MainWindow", "Rule"))
        self.Life.setText(_translate("MainWindow", "Your Life"))
        self.Love.setText(_translate("MainWindow", "Love"))


class UiHuntTab(object):
    uiText = f"<html><head/><body><p>Hp: {hp} Exp: {exp}/{expMax} Level: {level}</p><p>Enemy Level: {enemyLevel}</p><p>Enemy Health: {enemyHp}</p><p>Enemy attacks: {enemyAttackMin} - {enemyAttackMax}</p><p><br/></p></body></html>"

    def __init__(self, HuntTab):
        super(UiHuntTab, self).__init__()
        self.HuntPotions = QtWidgets.QPushButton(HuntTab)
        self.HuntHide = QtWidgets.QPushButton(HuntTab)
        self.HuntDefend = QtWidgets.QPushButton(HuntTab)
        self.HuntAttack = QtWidgets.QPushButton(HuntTab)
        self.HuntTabOutput = QtWidgets.QLabel(HuntTab)
        self.iniUi()

    def iniUi(self):
        self.HuntAttack.clicked.connect(self.Attack)
        self.HuntHide.clicked.connect(self.Hide)

    def Attack(self):
        global hp
        global enemyHp
        global exp
        if hp > 0:
            attack = random.randrange(attackMin, attackMax   1, 1)
            enAttack = random.randrange(enemyAttackMin, enemyAttackMax   1, 1)
            hp -= enAttack
            enemyHp -= attack
            if enemyHp < 1:
                exp  = enemyLevel * 20
                self.NewEnemy()
                if exp >= expMax:
                    self.LevelUp()
            uiText = f"<html><head/><body><p>Hp: {hp} Exp: {exp}/{expMax} Level: {level}</p><p>Enemy Level: {enemyLevel}</p><p>Enemy Health: {enemyHp}</p><p>Enemy attacks: {enemyAttackMin} - {enemyAttackMax}</p><p><br/></p></body></html>"
            self.HuntTabOutput.setText(uiText)
        if hp < 1:
            hp = 0
            # Death Death Death Death Death Death Death Death

    def Hide(self):
        global hp
        if hp > 0:
            hp  = 5
            if hp >= hpMax:
                hp = hpMax
            prob = random.randrange(1, 11, 1)
            if prob == 5:
                hp -= random.randrange(enemyAttackMin, enemyAttackMax, 1)
            uiText = f"<html><head/><body><p>Hp: {hp} Exp: {exp}/{expMax} Level: {level}</p><p>Enemy Level: {enemyLevel}</p><p>Enemy Health: {enemyHp}</p><p>Enemy attacks: {enemyAttackMin} - {enemyAttackMax}</p><p><br/></p></body></html>"
            self.HuntTabOutput.setText(uiText)

    def LevelUp(self):
        global level
        global attackMax
        global attackMin
        global expMax
        global exp
        global hpMax
        global hp
        level  = 1
        expMax = (level - 1) * 200
        hpMax  = 20
        hp = hpMax
        attackMax  = random.randrange(1, 3, 1)
        attackMin  = random.randrange(1, 3, 1)
        exp = 0
        uiText = f"<html><head/><body><p>Hp: {hp} Exp: {exp}/{expMax} Level: {level}</p><p>Enemy Level: {enemyLevel}</p><p>Enemy Health: {enemyHp}</p><p>Enemy attacks: {enemyAttackMin} - {enemyAttackMax}</p><p><br/></p></body></html>"
        self.HuntTabOutput.setText(uiText)

    def NewEnemy(self):
        global enemyLevel
        global enemyHp
        global enemyAttackMax
        global enemyAttackMin
        enemyLevel = random.randrange(1, 4, 1) * level
        enemyHp = enemyLevel * 20   20
        enemyAttackMax = random.randrange(2, 4, 1) * enemyLevel
        enemyAttackMin = random.randrange(1, 3, 1) * enemyLevel
        uiText = f"<html><head/><body><p>Hp: {hp} Exp: {exp}/{expMax} Level: {level}</p><p>Enemy Level: {enemyLevel}</p><p>Enemy Health: {enemyHp}</p><p>Enemy attacks: {enemyAttackMin} - {enemyAttackMax}</p><p><br/></p></body></html>"
        self.HuntTabOutput.setText(uiText)

    def setupUi(self, HuntTab):
        HuntTab.setObjectName("HuntTab")
        HuntTab.resize(379, 263)
        self.HuntTabOutput.setGeometry(QtCore.QRect(30, 30, 150, 101))
        self.HuntTabOutput.setObjectName("HuntTabOutput")
        self.HuntAttack.setGeometry(QtCore.QRect(30, 140, 91, 41))
        self.HuntAttack.setObjectName("HuntAttack")
        self.HuntDefend.setGeometry(QtCore.QRect(140, 140, 91, 41))
        self.HuntDefend.setObjectName("HuntDefend")
        self.HuntHide.setGeometry(QtCore.QRect(250, 140, 91, 41))
        self.HuntHide.setObjectName("HuntHide")
        self.HuntPotions.setGeometry(QtCore.QRect(140, 190, 91, 41))
        self.HuntPotions.setObjectName("HuntPotions")

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

    def retranslateUi(self, HuntTab):
        _translate = QtCore.QCoreApplication.translate
        HuntTab.setWindowTitle(_translate("HuntTab", "Hunt"))
        self.HuntTabOutput.setText(_translate("HuntTab", self.uiText))
        self.HuntAttack.setText(_translate("HuntTab", "Attack"))
        self.HuntDefend.setText(_translate("HuntTab", "Defend"))
        self.HuntHide.setText(_translate("HuntTab", "Hide"))
        self.HuntPotions.setText(_translate("HuntTab", "Potions"))


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = UiMainWindow(MainWindow)
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
 

Комментарии:

1. Итак, в чем именно ваша проблема? Где вы пытаетесь «уничтожить» все дочерние окна? Также, обратите внимание, что есть некоторые проблемы с вашим кодом, но самое главное: 1. вы должны не использовать глобальные переменные; 2. вы должны не редактировать файлы, созданные с помощью pyuic (не пытайтесь имитировать их поведение), так это то, что почти всегда приводит к путанице в структуре объекта и выполнение: после того, как эти файлы создаются, они должны только быть импортированы и никогда не изменяется; подробнее о том, как правильно использовать конструктор файлов .

Ответ №1:

Это было проще, чем я ожидал, В class UiHuntTab и В __init__ я только что добавил self.HuntTabWindow = HuntTab , И когда я хочу закрыть охоту, мне нужно было только позвонить self.HuntTabWindow.close()

 class UiHuntTab(object):
    def __init__(self, HuntTab):
    super(UiHuntTab, self).__init__()

    self.HuntTabWindow = HuntTab

    self.HuntPotions = QtWidgets.QPushButton(HuntTab)
    self.HuntHide = QtWidgets.QPushButton(HuntTab)
    self.HuntDefend = QtWidgets.QPushButton(HuntTab)
    self.HuntAttack = QtWidgets.QPushButton(HuntTab)
    self.HuntTabOutput = QtWidgets.QLabel(HuntTab)
    self.iniUi()
 

a

     if hp < 1:
       self.HuntTabWindow.close()
 

И если бы я хотел закрыть self.MainWindow = MainWindow главное окно и self.MainWindow.close()