我正在修改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
答案 0 :(得分:0)
我自己不是一位经验丰富的python程序员,但是我发现有一些事情可能会帮助您。
请确保您在此处发布的代码已经过测试,如果在我无法首先帮助您之前必须调试代码,这会有点烦人。 (指的是底部的第三行以及缩进)。
Button(command)
接受一个函数作为参数。您提供了一个对象。因此,请尝试将命令切换为command = lblframe1_view
而不是lblframe1
。
tkinter中的帧是对象,因此,除非您全局声明它们或将其作为参数传递,否则无法从未定义它们的函数访问它们。这意味着如果调用lblframe1_view()
,它将不知道lblframe3
或lblframe2
是什么。
希望这对您有所帮助。
编辑:
我只是意识到,程序结构可能还有另一个问题,不能通过将框架声明为全局变量来解决。
您想在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()