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