Я сделал что-то очень похожее на это, и так, как я его обработал, я составил список в основной программе, в которой были все «внутренние окна» или все, что вы хотите назвать. Всякий раз, когда основная программа получила сигнал от окна, чтобы закрыть его, он удалил его из списка.
Чтобы сделать сигнал, вы захотите создать прямоугольник в том месте, где вы хотите, чтобы кнопка была. Сделайте функцию для «внутреннего окна» и проверите ее для щелчка. Если щелкнуть, функция возвращает что-то вроде 'closed'
или что угодно. В основной программе скажите что-то вроде
for window in windows:
if window.update()=='closed':
windows.remove(window)
чтобы удалить все закрытые окна.
EDIT:
После просмотра кода немного больше в глубину, это выглядит, как вы делаете это не будет работать. Чтобы добавить прямоугольник, вам нужно будет что-то в вашем главном коде, чтобы сохранить, есть ли прямоугольник. Чтобы закрыть окно, вам придется изменить эту переменную.
Чтобы проверить, следует ли закрыть прямоугольник, создайте еще один прямоугольник, в котором должен быть закрыт текст. Когда этот текст будет нажат, функция возвращает то, что должно быть интерпретировано основным кодом, чтобы закрыть окно.
Ниже приведен базовый пример.
Класс:
def update(self):
#set up the test rect
text=self.font.render('Quit', True, (84,84,84))
textrect=text.get_rect()
textrect.topleft=(550, 375)
#see if the button is pressed
if textrect.collidepoint(pygame.mouse.get_pos()) and pygame.mouse.get_pressed()[0]:
return 'closed'
#render stuff
self.rect = pygame.draw.rect(self.screen, (white), (300, 200, 300, 200), 2)
self.screen.blit(text, (550, 375))
Обратите внимание, что я объединил свои два оригинальных классов в один, так как я не вижу причин, почему вы никогда не хотите, прямоугольник, но не текст или наоборот. Это довольно простое изменение, если вам это не нравится.
Также обратите внимание, что это закроет окно, если мышь нажата на кнопку, а затем перетащить на нее. Чтобы этого избежать, вам нужно будет передать список, полученный от pygame.event.get()
, в качестве аргумента для функции update
и выполнить поиск по нему для события MOUSEBUTTONDOWN
, но это вызовет ненужные осложнения, которые я пытался избежать.
Основной код:
rectOn=False
while True:
if rectOn:
if rect.update()=='closed':
rectOn=False
Чтобы сделать прямоугольник появится снова после того, как он был закрыт, просто установите rectOn
в True
.
Возможный дубликат [Pygame action при нажатии кнопки мыши на .rect?] (Http: // stackoverflow.com/questions/12150957/pygame-action-when-mouse-click-on-rect) –