Tkinter显示不同的帧

时间:2018-11-04 14:28:34

标签: python-3.x tkinter

更新:通过删除第二个函数中的window.mainloop()解决了问题。

我正在尝试使用tkinter在Python 3.7中制作游戏。

游戏从菜单(框架中的按钮小部件)开始。单击“播放”按钮应使用其他框架打开另一个菜单。第二个菜单应包含一个“后退”按钮,以返回到第一个菜单。

每个菜单都在功能中定义。因此,要从主菜单转到播放菜单,我会在“播放”按钮用作命令的函数中调用函数playMenu(window)。

它看起来像这样:

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

在播放菜单中,用作“后退按钮”命令的功能通过破坏其框架并使用return来结束该功能。

因此程序应返回到clickButtonPlay()函数并向后显示主菜单的框架,但反而出现了tkinter错误:

_tkinter.TclError:无法调用“网格”命令:应用程序已被破坏

但是我的菜单menuFrame没有被破坏,只是没有网格!

任何人都可以帮助我了解代码的问题或找到一种更简单的方法来完成相同的事情吗?

非常感谢您!

以下是我的程序工作方式的示例:

mainMenu文件:

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 :(得分:0)

问题(或者至少是 a 问题)是您多次致电mainloop。每次您调用它时,都会创建一个 new 无限循环。直到主窗口被销毁,新的循环才会退出。一旦发生这种情况,前一个循环很可能会引发错误,因为它所管理的小部件已不存在。