首页 > 解决方案 > 销毁所有子窗口

问题描述

我目前正在使用 pyqt5 制作基于文本的游戏,我正在使用设计器制作 Windows,因为它更容易,一切都很好,直到我试图找出如何销毁单个子窗口我找到了一些答案,但它没有t 适合我的情况(或者我不擅长这个)。

注意:我正在使用设计器制作 UI

问题:当 Hp 小于 1 时,我的问题正在破坏子窗口 (HuntTab),无法找到答案

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

标签: pythonpyqt5

解决方案


它比我预期的要容易,class UiHuntTab__init__我刚刚添加的self.HuntTabWindow = HuntTab和当我想关闭 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()

一个

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

如果我想关闭 MainWindowself.MainWindow = MainWindowself.MainWindow.close()


推荐阅读