重置Tkinter窗口,还原小部件

问题描述 投票:0回答:2

我希望创建一个按钮来完全重置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()

有没有办法完全重置窗口?

python tkinter
2个回答
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

你可以看到它有效。画布的子窗口小部件(按钮)被破坏,因为画布被破坏了。


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并且你无法访问Widget - 即。你不能破坏它。你必须分两步完成

var = Widget()
var.pack()

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

Widget().pack()

当您可以访问所有小部件时,您可以更改每个小部件中的设置(即明文),而不是销毁所有小部件。

© www.soinside.com 2019 - 2024. All rights reserved.