销毁标签框架

时间:2020-05-30 14:41:15

标签: python-3.x tkinter

我正在修改Tkinter / python中的基本内容。我正在使用与几个单击的按钮相对应的LabelFrame。我正在努力破坏其他框架,并且仅在单击某个按钮时才显示我希望看到的框架。当我运行此代码时:

def lblframe1_view():
    lblframe3.destroy()
    lblframe2.destroy()
    lblframe1 = LabelFrame(root, text="This is Frame One", height=370, width=370, bd=5, relief=FLAT).place(x=215, y=20)
    btn1 = Button(lblframe1, text="this is button one").pack()


def lblframe2_view():
    lblframe1.destroy()
    lblframe3.destroy()
    lblframe2 = LabelFrame(root, text="Frame Two", height=370, width=370, bd=5, relief=FLAT).place(x=215, y=20)
    btn2 = Button(lblframe2, text="this is button two").pack()


def lblframe3_view():
    lblframe1.destroy()
    lblframe2.destroy
    lblframe3 = LabelFrame(root, text="this is frame 3", height=370, width=370, bd=5, relief=FLAT).place(x=215, y=20)



def exit():
    root.destroy()

manbtn1 = Button(root, text="Frame 1", bg="white", height=4, width=25, command=lblframe1).place(x=10, y=20)
mainbtn2 = Button(root, text="Frame 2, bg="white", height=4, width=25, command=lblframe2).place(x=10, y=120)
mainbtn3 = Button(root, text="Frame 3", bg="white", height=4, width=25, command=lblframe3).place(x=10, y=220)
exitbtn = Button(root, text="Exit", bg="white", height=4, width=25, command=exit).place(x=10, y=320)

运行此命令时,出现以下错误:

NameError:名称'lblframe3'未定义

我试图将功能放在按钮后面,并得到相同的错误。我已经对此进行了研究 而且还无法弄清楚为什么这种情况一直在发生。我的直觉是python

2 个答案:

答案 0 :(得分:0)

我自己不是一位经验丰富的python程序员,但是我发现有一些事情可能会帮助您。

  1. 请确保您在此处发布的代码已经过测试,如果在我无法首先帮助您之前必须调试代码,这会有点烦人。 (指的是底部的第三行以及缩进)。

  2. Button(command)接受一个函数作为参数。您提供了一个对象。因此,请尝试将命令切换为command = lblframe1_view而不是lblframe1

  3. tkinter中的帧是对象,因此,除非您全局声明它们或将其作为参数传递,否则无法从未定义它们的函数访问它们。这意味着如果调用lblframe1_view(),它将不知道lblframe3lblframe2是什么。

希望这对您有所帮助。


编辑: 我只是意识到,程序结构可能还有另一个问题,不能通过将框架声明为全局变量来解决。 您想在lblframe1_view中销毁一个尚不存在的对象,因为只有事先执行lblframe2_view()lblframe3_view()才会创建该对象。但是,由于尚未创建lblframe1,因此这两个函数也会引发错误。

答案 1 :(得分:0)

我能够进行一些研究,找到了所需的答案:为此,我将YouTube的senddex归功于我。他基本上将框架堆叠在一起,然后单击按钮实际上会根据命令调用框架。

from tkinter import *
import tkinter as tk
from tkinter import ttk


LARGE_FONT = ("verdana", 12)



class tool(tk.Tk):

def __init__(self, *args, **kwargs):

    tk.Tk.__init__(self, *args, **kwargs)
    tk.Tk.iconbitmap(self, default="supporticon.ico")

    self.geometry("400x400")
    self.resizable(0,0)
    container = tk.Frame(self)
    container.pack(side="top", fill="both", expand = True)
    container.grid_rowconfigure(0, weight=1)
    container.grid_columnconfigure(0, weight=1)



    self.frames = {}

    for F in (StartPage, PageOne):

        frame = F(container, self)

        self.frames[F] = frame

        frame.grid(row=0, column=0, sticky="nsew") 
        frame.config(bg="darkblue")


    self.show_frame(StartPage)

def show_frame(self, cont):

    frame = self.frames[cont]
    frame.tkraise()

class StartPage(tk.Frame):

def __init__(self, parent, controller):

    tk.Frame.__init__(self,parent)

    homeframe = LabelFrame(self, text="testing this out", width=200, height=350)
    homeframe.config(background="darkblue", fg="white")
    homeframe.pack()
    label = Label(homeframe, text="Start Page", font=LARGE_FONT)
    label.config(background="darkblue", fg="white", height=400, width=450)
    label.place(x=10, y=20)

    button1 = ttk.Button(homeframe, text="Vist Page 1", 
                        command=lambda: controller.show_frame(PageOne))
    button1.pack()

class PageOne(tk.Frame):
def __init__(self, parent, controller):

    tk.Frame.__init__(self, parent)
    label = tk.Label(self, text="Page One", font=LARGE_FONT)
    label.pack(pady=10, padx=10)

    button1 = tk.Button(self, text="Back to Home",
        command=lambda: controller.show_frame(StartPage))
    button1.pack()


app = tool()
app.resizabe=(0,0)
app.geometry=("450x450")
app.mainloop()