简体   繁体   中英

How do I destroy a tkinter frame?

I am trying to make a tkinter frame that will contain an entry field and a submit button. When the submit button is pressed, I want to pass the entry string to the program and destroy the frame. After many experiments, I came up with this script:

from tkinter import *
from tkinter import ttk
import time

root = Tk()
entryframe = ttk.Frame(root)
entryframe.pack()
par = StringVar('')
entrypar = ttk.Entry(entryframe, textvariable=par)
entrypar.pack()
submit = ttk.Button(entryframe, text='Submit', command=entryframe.quit)
submit.pack()
entryframe.mainloop()
entryframe.destroy()
parval = par.get()
print(parval)
time.sleep(3)
root.mainloop()

When the "Submit" button is pressed, the parameter value is passed correctly to the script and printed. However, the entry frame is destroyed only after 3 seconds (set by the time.sleep function). I want to destroy the entry frame immediately. I have a slightly different version of the script in which the entry frame does get destroyed immediately (although the button itself is not destroyed), but the value of par is not printed:

from tkinter import *
from tkinter import ttk
import time

root = Tk()
entryframe = ttk.Frame(root)
entryframe.pack()
par = StringVar('')
entrypar = ttk.Entry(entryframe, textvariable=par)
entrypar.pack()
submit = ttk.Button(root, text='Submit', command=entryframe.destroy)
submit.pack()
entryframe.mainloop()
# entryframe.destroy()
parval = par.get()
print(parval)
time.sleep(3)
root.mainloop()

How can I get both actions, namely the entry frame destroyed immediately and the value of par printed?

Note 100% sure what you are trying to do but look at this code:

from tkinter import *
from tkinter import ttk

def print_results():
    global user_input # If you want to access the user's input from outside the function
    # Handle the user's input
    user_input = entrypar.get()
    print(user_input)
    # Destroy whatever you want here:
    entrypar.destroy()
    submit.destroy()
    # If you want you can also destroy the window: root.destroy()

    # I will create a new `Label` with the user's input:
    label = Label(root, text=user_input)
    label.pack()

# Create a tkitner window
root = Tk()

# Create the entry
entrypar = ttk.Entry(root)
entrypar.pack()

# Create the button and tell tkinter to call `print_results` whenever
# the button is pressed
submit = ttk.Button(root, text="Submit", command=print_results)
submit.pack()

# Run tkinter's main loop
# It will stop only when all tkinter windows are closed
root.mainloop()

# Because of the `global user_input` now we can use:
print("Again, user_input =", user_input)

I defined a function which will destroy the entry and the button. It also creates a new label that displays the user's input.

I was able to accomplish what I wanted using the wait_window method. Here is the correct script:

from tkinter import *
from tkinter import ttk

root = Tk()
entryframe = ttk.Frame(root)
entryframe.pack()
entrypar = ttk.Entry(entryframe)
entrypar.pack()
submit = ttk.Button(entryframe, text='Submit', command=entryframe.destroy)
submit.pack()
entrypar.wait_window()
parval = entrypar.get()
print(parval)
close_button = ttk.Button(root, text='Close', command=root.destroy)
close_button.pack()
root.mainloop()

My intention was not fully apparent in my original question, and I apologize for that. Anyway, the answers did put me on the right track, and I am immensely thankful.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM