Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter GUI创建新的小部件?_Python_Function_User Interface_Tkinter_Widget - Fatal编程技术网

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()
    方法

一件事是,我在函数(如transfersMenu())中定义了我的所有小部件,这些函数可以无限期运行(如上所示),因为我的游戏是带有菜单的足球管理游戏。我怎样才能改变这一点?@Xaeol不太清楚您想要什么,但据我所知,您希望在每次选择菜单中的新选项时都会出现一组不同的小部件,但您当前的方法是在每次调用函数时销毁框架并放置小部件(如果我搞错了,请纠正我)我的建议是将这些小部件预先放置在框架中(您以后也可以放置其他小部件),您的函数需要做的就是调用
clear
,从而忘记当前打开的框架并放置所需的框架。一件事是我在函数中定义所有小部件(例如transfersMenu())这些功能可以无限期地运行(如上所示),因为我的游戏是一个带有菜单的足球管理游戏。我怎样才能改变这一点?@Xaeol不太清楚您想要什么,但据我所知,您希望在每次选择菜单中的新选项时都会出现一组不同的小部件,但您当前的方法是在每次调用函数时销毁框架并放置小部件(如果我搞错了,请纠正我)我的建议是将这些小部件预先放置在框架中(您也可以稍后放置其他小部件),您的功能需要做的就是调用
clear
,从而忘记当前打开的框架并放置所需的框架。