Clear text from tkinter entry widget
You are on the right track but you missed two little things. I added those two in your code and tried to explain with comments.
from Tkinter import *
def delete_entries():
for field in fields:
field.delete(0,END)
def UserInput(status,name):
optionFrame = Frame(root)
optionLabel = Label(optionFrame)
optionLabel["text"] = name
optionLabel.pack(side=LEFT)
var = StringVar(root)
var.set(status)
w = Entry(optionFrame, textvariable= var)
w.pack(side = LEFT)
optionFrame.pack()
return w
#this return is crucial because if you don't return your widget's identity,
#you can not use them in another function
if __name__ == '__main__':
root = Tk()
ExperimentNumber = UserInput("1", "Experiment number")
OutputFileName = UserInput("output.txt", "Output file name")
npts1 = UserInput("1000", "Number of points")
block1 = UserInput("8", "Block size")
#you are saying it does not work because of they are strings.
#then don't assign strings to fields. assign variables.
fields = ExperimentNumber, OutputFileName, npts1, block1
#since fields is defined in global scope, you don't need to use it as parameter
Delete_button = Button(root, text = 'Clear all', command = delete_entries)
Delete_button.pack()
root.mainloop()
218
Updated on June 04, 2022Comments
-
218 almost 2 years
I am using Tkinter entry widgets to allow users to input text to a GUI. The entry widgets have default text which I would like to clear with a single button press. I have the following code:
from Tkinter import * def delete_entries(fields): for field in fields: field.delete(0,END) def UserInput(status,name): optionFrame = Frame(root) optionLabel = Label(optionFrame) optionLabel["text"] = name optionLabel.pack(side=LEFT) var = StringVar(root) var.set(status) w = Entry(optionFrame, textvariable= var) w.pack(side = LEFT) optionFrame.pack() if __name__ == '__main__': root = Tk() fields = 'ExperimentNumber', 'OutputFileName', 'npts1', 'block1' ExperimentNumber = UserInput("1", "Experiment number") OutputFileName = UserInput("output.txt", "Output file name") npts1 = UserInput("1000", "Number of points") block1 = UserInput("8", "Block size") Delete_button = Button(root, text = 'Clear all', command = delete_entries(fields)) Delete_button.pack()
I have tried creating
fields
with the list of variables that I want to delete (as above) and iterating over this in the functiondelete_entries()
, however this returns an error because the entries in fields are strings. I have tried replacing fields withfields = ExperimentNumber
for example, but this returns an error because ExperimentNumber hasn't yet been defined. Finally I tried puttingExperimentNumber
within the delete function i.e.def delete_entries(): ExperimentNumber.delete(0,End)
but this doesn't work because
ExperimentNumber
has the attributeNoneType
(I don't understand why this is, because thedelete_entries()
function isn't called until after theExperimentNumber
Entry widget is created via the functionUserInput
). How can I go about deleting all the text in the Entry widgets? I have about 20 of these in my actual code and would like the user to be able to clear all the fields with one button press.