【问题标题】:Tkinter GUI Creating New Widgets?Tkinter GUI 创建新的小部件?
【发布时间】:2021-04-12 21:52:21
【问题描述】:

我是 Tkinter 的新手,但我正在使用它来创建一个足球管理游戏 that looks like this

我的代码按预期运行,但我担心它的效率。 在我的游戏中,我使用按钮小部件在菜单中导航,我创建的每个菜单都使用一个函数。我使用的代码看起来像这样:

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 命令会破坏框架并重新创建它。这是为了清除框架上的所有小部件并准备使用新小部件打开新菜单。由于创建新框架,销毁和重新创建小部件会导致内存泄漏吗?我不知道如何重写我的所有代码,以便我重用我的所有小部件而不是破坏它们,所以 - 如果是这样 - 我怎么能这样做呢? (对不起,如果我没有很好地传达这个问题)

【问题讨论】:

    标签: python function user-interface tkinter widget


    【解决方案1】:

    这是您可以尝试的众多方法中的一种,请查看下面的示例

    from tkinter import *
    
    root=Tk()
    
    def switch(frame):
        clear()
        frame.pack()
    
    def clear():
        for f in frames:
            f.pack_forget()
    
    frame1=Frame(root)
    #widgets of frame1
    label1=Label(frame1,text='Label 1')
    label1.pack()
    
    frame2=Frame(root)
    #widgets of frame2
    label2=Label(frame2,text='Label 2')
    label2.pack()
    
    frame1_button=Button(root,text='Frame 1',command=lambda:switch(frame1))
    frame1_button.pack()
    frame2_button=Button(root,text='Frame 2',command=lambda:switch(frame2))
    frame2_button.pack()
    
    frame1.pack() #initial frame
    
    frames=[frame1,frame2] #store the frames in a list
    
    root.mainloop()
    

    注意事项

    • 这里的clear 函数使用pack_forget() 方法遍历所有帧的列表并临时删除它们(技术上只有当前打包的,因为其余的不是开始的),它可以是以类似的方式与任何几何管理器一起使用。
    • switch函数将需要打包的帧作为参数,调用clear函数,然后在帧上使用pack()方法。

    【讨论】:

    • 一件事是我在函数中定义了我的所有小部件(例如 transferMenu() )并且这些函数可以无限时间运行(如上所示),因为我的游戏是一个足球管理游戏菜单。我怎么能改变这个?
    • @Xaeol 它不是很清楚你想要什么,但据我了解,每次选择菜单中的新选项时,你希望出现一组不同的小部件,但你目前的方法是每次调用函数时销毁框架并放置小部件(如果我弄错了,请纠正我)我的建议是将这些小部件 预先放置 在框架中(您可以放置​​其他小部件稍后也会),您需要做的所有功能就是调用 clear 从而忘记当前打开的框架并放置您想要的框架。
    猜你喜欢
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2019-04-23
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多