简体   繁体   中英

Python-tkinter: For loop supposed to collect entries from an array and pass to text box, only passes last entry

I'm new to coding, so apologies if this question is a little base. Anyways, this GUI im making in python is supposed to collect several user entries, and pass them to a text box in the GUI. Right now though, the for loop at the end of the code is only putting the last entry into the text box. Why?

from Tkinter import *

class Application(Frame):
""" A SPC program that takes user input and saves the file """
def __init__(self,master):
    """ initializes the frame """
    Frame.__init__(self,master)
    self.grid()
    #creates an array to store entries into
    self.entry_list = [None]*7
    self.create_widgets()


def create_widgets(self):
    """create widgets for user inputted data"""
    # creates a text widget next to the entries that displays what the user has input
    Label(self, text = "Do these values you entered seem correct?").grid(row = 0, column = 4, sticky = W, padx = 5, pady = 5)
    self.checktext = Text(self, width =15, height = 42, wrap = WORD)
    self.checktext.grid(row = 1, rowspan = 10, column = 4, sticky = W, padx =5, pady =5)

    # get name
    Label(self, text = "First Name:").grid(row = 0, column = 0, sticky = W, padx=5, pady=5)
    self.entry_list[0] = Entry(self)
    self.entry_list[0].grid(row = 0, column = 1)       
    Label(self, text = "Last Name:").grid(row = 1, column = 0, sticky = W, padx=5, pady=5)
    self.entry_list[1] = Entry(self)
    self.entry_list[1].grid(row = 1, column = 1)

    # get work order
    Label(self, text = "Work Order Number:").grid(row = 2, column = 0, sticky = W, padx=5, pady=5)
    self.entry_list[2] = Entry(self)
    self.entry_list[2].grid(row = 2, column = 1)

    # get todays date
    Label(self, text = "Todays Date:").grid(row = 3, column = 0, sticky = W, padx=5, pady=5)
    self.entry_list[3] = Entry(self)
    self.entry_list[3].grid(row = 3, column = 1)

    # get bubble number
    Label(self, text = "Bubble Number:").grid(row = 4, column = 0, sticky = W, padx=5, pady=5)
    self.entry_list[4] = Entry(self)
    self.entry_list[4].grid(row = 4, column = 1)

    # get USL and LSL
    Label(self, text = "USL:").grid(row = 5, column = 0, sticky = W, padx=5, pady=5)        
    self.entry_list[5] = Entry(self)
    self.entry_list[5].grid(row = 5, column = 1)    
    Label(self, text = "LSL:").grid(row = 6, column = 0, sticky = W, padx=5, pady=5)       
    self.entry_list[6] = Entry(self)
    self.entry_list[6].grid(row = 6, column = 1)                      

    # button to submit user entered values up to the input data values portion of the gui
    self.button = Button(self)
    self.button["text"] = "Submit"
    self.button["command"] = self.submit
    self.button.grid(row = 5, column = 2, sticky = W, padx=5, pady=5)

    # creates a spot to dictate whether USL and LSL are correct
    self.checklimits = Text(self, width = 20, height = 3, wrap = WORD)
    self.checklimits.grid(row = 6, column = 3, sticky = W, padx = 5)

    """# get User Input Data values
    Label(self, text = "Enter Results:").grid(row = 7, column = 0, sticky = W, padx=5, pady=5)        
    self.entry_list8 = Text(self, width = 15, height = 30)
    self.entry_list8.grid(row = 7, column = 1) """  

def submit(self):
    """ submits user data up to input data section of GUI and checks USL vs LSL"""
    # checks to make sure limits were imput properly
    USL = int(self.entry_list[5].get())
    LSL = int(self.entry_list[6].get())

    if USL > LSL:
        message = "Limits are good"
    else:
        message = "USL can't be less than LSL, please re-enter USL and LSL"

    self.checklimits.delete(0.0, END)
    self.checklimits.insert(0.0, message)


    # puts entries into text box
    for x in self.entry_list:
       entry = x.get()
       if entry:
            self.checktext.delete(0.0, END)
            self.checktext.insert(END, entry + "\n")




root = Tk()
root.title("SPC Input Program")
root.geometry("700x750")

app = Application(root)

The problem is here:

for x in self.entry_list:
   entry = x.get()
   if entry:
        self.checktext.delete(0.0, END)
        self.checktext.insert(END, entry + "\n")

You're deleting everything in the widget before putting the next string into it, every time. To fix the issue, simply don't delete everything every time. If you want to clear the widget before repopulating it, move the deletion out of the loop:

self.checktext.delete(0.0, END)
for x in self.entry_list:
   entry = x.get()
   if entry:
        self.checktext.insert(END, entry + "\n")

Ok I figured it out and boy do I feel dumb. So here was my for loop before:

for x in self.entry_list:
   entry = x.get()
   if entry:
        self.checktext.delete(0.0, END)
        self.checktext.insert(END, entry + "\n")

That self.chectext.delete(0.0, END) line is there to delete whatever the user input into the text box each time they submit, but by being inside the for loop it deleted each entry before adding the next. So duh, of course it would only show the last entry because it deleted the first few! So I put the line outside of the for loop like so:

# puts entries into text box
    self.checktext.delete(0.0, END)     
    for x in self.entry_list:
       entry = x.get()
       if entry:
            print entry                
            self.checktext.insert(END, entry + "\n")

and now it works fine

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