重置Tkinter窗口,还原小部件

时间:2019-04-14 14:24:45

标签: python tkinter

我希望创建一个按钮来完全重置Tkinter窗口,就好像该程序是从头开始运行的。这是我目前的做法。但是,它没有按预期工作。

from tkinter import *

master = Tk()

    def do_something_():
         #*performing a function on widget*

    DoThing = Button(master, text='Do Something',command=do_something_).pack(pady=10)

    clearall = Button(master, text='reset', command=resetAll).pack(pady=10)

    def resetAll():

        master.destroy()

        master = Tk()

mainloop()

有什么办法可以完全重置窗口?

2 个答案:

答案 0 :(得分:1)

您可以创建函数来创建Frame并将小部件放置在此框架中。然后您可以将框架放在窗口中。

按下按钮时,您可以destroy()删除所有小部件,并可以运行相同的功能再次创建小部件。或者,您可以运行不同的功能以使用小部件创建不同的框架-这样就可以替换窗口中的内容。

from tkinter import *

# --- functions ---

def create_frame(master):
    print("create frame")

    frame = Frame(master)

    b = Button(frame, text='Do Something')
    b.pack(pady=10)

    clearall = Button(frame, text='reset', command=reset_all)
    clearall.pack(pady=10)

    return frame

def reset_all():
    global frame

    frame.destroy()
    frame = create_frame(master)
    #frame = create_different_frame(master)
    frame.pack()

# --- main ---


master = Tk()

frame = create_frame(master)
frame.pack()

mainloop()

顺便说一句:如果您进行var = Widget().pack(),则将None分配给var,并且您无权访问窗口小部件-即。你不能破坏它。您必须分两步完成

var = Widget()
var.pack()

如果您不需要访问小部件,则不需要变量

Widget().pack()

然后,当您有权访问所有小部件时,可以更改每个小部件中的设置(即纯文本),而不用破坏所有小部件。

答案 1 :(得分:0)

您可以创建一个画布(或框架),然后使DoThing和clearall按钮将画布(或框架)作为其主窗口小部件。然后,您可以使resetAll子例程破坏画布(或框架)。然后,这也将破坏画布的所有子部件。

注意:我还修复了代码中的一些语法错误(例如,您在引用它之后定义了resetALL子例程。)

代码:

from tkinter import *

master = Tk()

def do_something_():
    print('do something') #I added this so that i can run the code with no errors
    #*performing a function on widget*

def resetAll():
    canvas.destroy() #destroys the canvas and therefore all of its child-widgets too


canvas = Canvas(master)
canvas.pack()
#creates the cnvas

DoThing = Button(canvas, text='Do Something',command=do_something_).pack(pady=10) 
#its master widget is now the canvas

clearall = Button(canvas, text='reset', command=resetAll).pack(pady=10)
#its master widget is now the canvas

master.mainloop()

我运行了这段代码。

这是我单击“重置”按钮之前的GUI:

gui1

这是我单击“重置”按钮后的GUI:

gui2

如您所见,它起作用了。画布的子小部件(按钮)被破坏了,因为画布被破坏了。