Ткинтер отображает разные кадры - PullRequest
0 голосов
/ 04 ноября 2018

ОБНОВЛЕНИЕ: проблема была решена удалением window.mainloop () в моей второй функции.

Я пытаюсь сделать игру на Python 3.7, используя tkinter.

Игра начинается с меню (кнопки-виджеты в рамке). Нажатие на кнопку «Воспроизвести» должно открыть другое меню, используя другой кадр. Это второе меню должно содержать кнопку «назад» для возврата в первое меню.

Каждое меню определено в функции. Таким образом, чтобы перейти из главного меню в меню воспроизведения , я вызываю функцию playMenu (окно) в функции, используемой в качестве команды кнопкой «Play».

Это выглядит так:

def clickButtonPlay():
    menuFrame.grid_remove()
    playMenu(window)
    menuFrame.grid()

В меню воспроизведения функция, используемая в качестве команды «кнопка назад», положила конец функции, уничтожив ее кадр и использовав возврат.

Таким образом, программа должна вернуться к функции clickButtonPlay () и показать кадр главного меню обратно, но вместо этого я получаю ошибку tkinter:

_tkinter.TclError: не может вызвать команду "grid": приложение было уничтожено

Но мой фрейм menuFrame не был уничтожен, просто без сетки!

Может кто-нибудь помочь мне понять, что не так с кодом, или найти более простой способ сделать то же самое?

Большое спасибо!

Вот пример работы моей программы:

Файл главного меню:

import tkinter as tk
from PlayMenu import playMenu
window = tk.Tk()
window.grid()

def menu(window):
    def clickButtonPlay():
        menuFrame.grid_remove()
        playMenu(window)
        menuFrame.grid()
    menuFrame = tk.Frame(window)
    menuFrame.grid()
    background = tk.Label(menuFrame, image= backgroundImage)
    background.grid()
    playButton = tk.Button(menuFrame, image= playButtonImage[0], command= clickButtonPlay)
    playButton.place(relx= 0.5, rely= 0.15)
    window.mainloop()

menu(window)

Файл playMenu:

class MyError(Exception):
    pass

def _playMenu(window):
    def clickButtonBack():
        playMenuFrame.destroy()
        raise MyError

    playMenuFrame = tk.Frame(window)
    playMenuFrame.grid()
    background = tk.Label(playMenuFrame, image= backgroundImage)
    background.grid()
    backButton = tk.Button(playMenuFrame, image= backButtonImage[0], command= clickButtonBack)
    backButton.place(relx=0.375, rely=0.8)

    window.mainloop()

def playMenu(window):
    try:
        return _playMenu(window)
    except MyError:
        return

1 Ответ

0 голосов
/ 05 ноября 2018

Проблема (или, по крайней мере, проблема) заключается в том, что вы звоните mainloop более одного раза. Каждый раз, когда вы вызываете его, создается бесконечный цикл new . Новый цикл не завершится, пока главное окно не будет уничтожено. Как только это произойдет, предыдущий цикл, скорее всего, выдаст ошибки, поскольку виджеты, которыми он управляет, больше не существуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...