Переключение между экранами игры

Рейтинг: 2Ответов: 2Опубликовано: 03.08.2023

Я хочу создать главное меню игры. У меня есть два экрана - экран меню и экран игры. В главном меню у меня цикл while True, чтобы после перехода в экран игры можно было выйти и цикл бы создал опять главное меню.

Проблема заключается в том, что походу из-за mainloop нельзя вернуться в цикл while True. Значит mainloop нужно остановить, чтобы попасть снова в цикл и создалось меню? Как это сделать?

Или может вообще делать меню с помощью бесконечного цикла это плохая идея? Если это так, то как тогда это сделать?

Вот код:

from tkinter import *

def back_to_main_menu():
    # Здесь надо как-то остановить mainloop
    ...

def game_screen():
    game_b = Button(root, text="Back to main menu", width=15, command=back_to_main_menu)
    game_b.pack(anchor=NW)
    game_l = Label(text="Game screen")
    game_l.pack()

def show_game_screen():
    menu_b1.destroy()

    game_screen()

root = Tk()
root.geometry("600x500")

while True:
    menu_b1 = Button(root, text="Play", width=15, command=show_game_screen)
    menu_b1.pack()
    
    root.mainloop()

Ответы

▲ 2Принят

Не нужен бесконечный цикл. Просто в одной функции создаете меню, в другой - создаете экран игры, между экранами переключаетесь кнопками, как у вас и сделано. Перед пересозданием экрана окно очищаете.

from tkinter import *


def clear_window():
    # Удалить все объекты из окна
    for widget in root.slaves():
        widget.destroy()


def main_menu():
    clear_window()
    menu_b1 = Button(root, text="Play", width=15, command=game_screen)
    menu_b1.pack()


def game_screen():
    clear_window()
    game_b = Button(root, text="Back to main menu", width=15, command=main_menu)
    game_b.pack(anchor=NW)
    game_l = Label(text="Game screen")
    game_l.pack()


root = Tk()
root.geometry("600x500")

main_menu()

root.mainloop()
▲ 0

Попробуйте использовать root.destroy(). Это должно будет остановить mainloop.