Python Tkinter GUI创建新的小部件?
我是特金特的新手,但我正在用它来创建一个足球管理游戏 我的代码按预期运行,但我担心它的效率。 在我的游戏中,我使用按钮小部件在菜单中导航,我使用一个函数创建每个菜单。我使用的代码如下所示:Python Tkinter GUI创建新的小部件?,python,function,user-interface,tkinter,widget,Python,Function,User Interface,Tkinter,Widget,我是特金特的新手,但我正在用它来创建一个足球管理游戏 我的代码按预期运行,但我担心它的效率。 在我的游戏中,我使用按钮小部件在菜单中导航,我使用一个函数创建每个菜单。我使用的代码如下所示: frame = tk.Frame(root, #insert code) transfersMenuButton = tk.Button(frame, command=TransfersMenu, #insert code) button.place(frame, #insert code) def Tr
frame = tk.Frame(root, #insert code)
transfersMenuButton = tk.Button(frame, command=TransfersMenu, #insert code)
button.place(frame, #insert code)
def TransfersMenu():
clear()
label = tk.Label(frame, #insert code)
label.place(frame, #insert code)
#more code
def clear():
frame.destroy()
frame = tk.Frame(root, #insert code)
正如您所看到的,clear命令会破坏帧并重新创建它。这是为了清除框架上的所有小部件,并准备使用新小部件打开新菜单。由于创建了新的框架,销毁和重新创建小部件会导致内存泄漏吗?我不知道如何重写我所有的代码,以便重用我所有的小部件,而不是销毁它们。因此——如果是的话——我该怎么做?
(很抱歉,如果我没有很好地传达这个问题)这是您可以尝试的众多方法中的一种,请检查下面的示例
从tkinter导入*
root=Tk()
def开关(机架):
清除()
frame.pack()
def clear():
对于帧中的f:
f、 打包
frame1=帧(根)
#frame1的小部件
label1=标签(frame1,text='Label 1')
标签1.pack()
frame2=帧(根)
#frame2的小部件
label2=标签(frame2,text='Label 2')
标签2.pack()
frame1_button=button(root,text='Frame 1',command=lambda:switch(frame1))
frame1_按钮包()
frame2_button=button(根,text='Frame 2',command=lambda:switch(frame2))
frame2_按钮包()
frame1.pack()#初始帧
frames=[frame1,frame2]#将帧存储在列表中
root.mainloop()
注释
- 此处的
函数通过使用clear
方法迭代所有帧的列表并临时删除它们(从技术上讲,仅删除当前打包的帧,因为其余的帧不是从一开始),它可以以类似的方式与任何几何体管理器一起使用pack\u-forget()
函数将需要打包的帧作为参数,调用开关
函数,然后在帧上使用清除
方法pack()
从tkinter导入*
root=Tk()
def开关(机架):
清除()
frame.pack()
def clear():
对于帧中的f:
f、 打包
frame1=帧(根)
#frame1的小部件
label1=标签(frame1,text='Label 1')
标签1.pack()
frame2=帧(根)
#frame2的小部件
label2=标签(frame2,text='Label 2')
标签2.pack()
frame1_button=button(root,text='Frame 1',command=lambda:switch(frame1))
frame1_按钮包()
frame2_button=button(根,text='Frame 2',command=lambda:switch(frame2))
frame2_按钮包()
frame1.pack()#初始帧
frames=[frame1,frame2]#将帧存储在列表中
root.mainloop()
注释
- 此处的
函数通过使用clear
方法迭代所有帧的列表并临时删除它们(从技术上讲,仅删除当前打包的帧,因为其余的帧不是从一开始),它可以以类似的方式与任何几何体管理器一起使用pack\u-forget()
函数将需要打包的帧作为参数,调用开关
函数,然后在帧上使用清除
方法pack()
clear
,从而忘记当前打开的框架并放置所需的框架。一件事是我在函数中定义所有小部件(例如transfersMenu())这些功能可以无限期地运行(如上所示),因为我的游戏是一个带有菜单的足球管理游戏。我怎样才能改变这一点?@Xaeol不太清楚您想要什么,但据我所知,您希望在每次选择菜单中的新选项时都会出现一组不同的小部件,但您当前的方法是在每次调用函数时销毁框架并放置小部件(如果我搞错了,请纠正我)我的建议是将这些小部件预先放置在框架中(您也可以稍后放置其他小部件),您的功能需要做的就是调用clear
,从而忘记当前打开的框架并放置所需的框架。