Clear text from tkinter entry widget

12,046

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()
Share:
12,046
218
Author by

218

Updated on June 04, 2022

Comments

  • 218
    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 function delete_entries(), however this returns an error because the entries in fields are strings. I have tried replacing fields with fields = ExperimentNumber for example, but this returns an error because ExperimentNumber hasn't yet been defined. Finally I tried putting ExperimentNumber within the delete function i.e.

    def delete_entries():
          ExperimentNumber.delete(0,End)
    

    but this doesn't work because ExperimentNumber has the attribute NoneType (I don't understand why this is, because the delete_entries() function isn't called until after the ExperimentNumber Entry widget is created via the function UserInput). 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.