我希望创建一个按钮来完全重置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()
有什么办法可以完全重置窗口?
答案 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:
这是我单击“重置”按钮后的GUI:
如您所见,它起作用了。画布的子小部件(按钮)被破坏了,因为画布被破坏了。