在Tkinter中使用pack_forget时如何使小部件再次可见

时间:2014-06-15 09:07:11

标签: python tkinter

我有这段代码:

# -*- coding: utf-8 -*-

def clear_screen():
    button2.pack_forget()
    button3.pack_forget()
    text.pack_forget()
    label.pack_forget()

def main_page():
    var = StringVar()
    label = Label( root, textvariable=var)
    var.set("Fill in the caps: ")
    label.pack()

    global text
    text = Text(root,font=("Purisa",12))
    text.pack()

    global button
    button=Button(root, text ="Create text with caps.", command =lambda: full_function())
    button.pack()

def clear_and_main():
    clear_screen()
    main_page()

def full_function():
    global button2
    global button3
    button3=Button(root, text ="Main page", command=lambda: clear_and_main())
    button3.pack()
    button2=Button(root, text ="Answer")
    button2.pack()
    button.pack_forget()

from Tkinter import *

root = Tk()

main_page()

root.mainloop()

我希望这个程序以这种方式工作,如果我点击按钮"主页面",它将重新创建主页面。但它并没有。 Textfield和按钮不会再出现。我怎么能让它正常工作?

1 个答案:

答案 0 :(得分:1)

您忽略了将textlabel声明为全局,因此clear_screen失败。

调用pack_forget不会破坏小部件,它只会隐藏它们。您的代码每次都会创建新的小部件,这意味着您有内存泄漏 - 每次单击按钮时都会创建越来越多的小部件。

实现所需内容的最简单方法是将所有小部件放在一个框架中,然后销毁并重新创建框架。销毁窗口小部件时,任何子窗口小部件都会自动销毁。这也使维护更容易,因为如果添加更多小部件,则无需进行任何更改。