Мой виджет ввода заменяет элемент в списке вместо добавления в качестве нового элемента?

Вместо того, чтобы добавлять запись job_list в список, он заменяет предыдущий элемент, когда вы пытаетесь ввести новое значение. Я думаю, что вы можете в основном сосредоточиться на методе store_job, вводе номера задания и кнопке ввода задания. Я не уверен, нужен ли мне метод сброса или что-то в этом роде, чтобы виджеты Entry могли принимать больше данных. Любая помощь приветствуется.

from tkinter import *
class EntryGUI:
    def __init__(self, parent):
        self.cb = IntVar()
        self.job_number_label= Label(parent, text = "Job number:")
        self.job_number_label.grid(row = 1, column = 0)
        self.job_number = Entry(parent)
        self.job_number.focus()
        self.job_number.grid(row=1, column = 1)
        self.customer_name_label = Label(parent, text = "Customer name:")
        self.customer_name_label.grid(row = 2, column = 0)
        self.customer_name = Entry(parent)
        self.customer_name.grid(row=2, column = 1)
        self.distance_label= Label(parent, text = "Distance Travelled (km):")
        self.distance_label.grid(row = 3, column = 0)
        self.distance = Entry(parent)
        self.distance.grid(row=3, column = 1)
        self.min_spent_label= Label(parent, text = "Minutes spent on Virus protection:")
        self.min_spent_label.grid(row = 4, column = 0)
        self.min_spent = Entry(parent)
        self.min_spent.grid(row=4, column = 1)
        wof_tune= Checkbutton(parent, variable = self.cb, text = "check if WOF and tune is required",
                          onvalue = 100, offvalue = 0)
        wof_tune.grid(row = 5, column = 0)
        self.enter = Button(parent, text = "Enter Job", command = lambda:[self.store_job(),self.calculate()])
        self.enter.grid(row = 6, column = 0)
        self.show_all = Button(parent, text = "Show All")
        self.show_all.grid(row = 6, column = 1)
    def store_job(self):
        self.job_list = []
        self.customer_list = []
        self.job_list.append(self.job_number.get())
        self.customer_list.append(self.customer_name.get())
        for i in self.job_list:
            print (i)


    def calculate(self):
        self.cost_list = []

        self.distance_calc = int(self.distance.get())
        self.min_calc = int(self.min_spent.get())
        self.cost = 0

        #calculates the travel cost
        #if the distance is less than 5km it costs 10
        if self.distance_calc <= 5:
            self.cost = 10
        else: 
            self.distance_calc = self.distance_calc - 5 #-5 as you calclate the extra distance
            self.distance_calc = self.distance_calc / 2 #divide by two as you add 50c per km
            self.cost = self.distance_calc + 10 #initial 10 plus half the extra distance
            #print(self.cost)

        self.cost = self.cost + (self.min_calc * 0.8)
        self.cost = self.cost + int(self.cb.get())
        self.cost_list.append(self.cost)
        print(self.cost_list)
        self.enter_next()

    def enter_next(self):

        self.job_number.delete(0,END)
        self.customer_name.delete(0, END)
        self.distance.delete(0, END)
        self.min_spent.delete(0, END)
        self.enter.configure(state = NORMAL)


if __name__=="__main__":
    root = Tk()
    show_label = EntryGUI(root)
    root.mainloop()

person Lucy    schedule 26.05.2018    source источник
comment
Попробуйте сократить это до минимально воспроизводимого примера. Например, если проблема связана с виджетом Entry, вам не нужна еще дюжина виджетов Entry и Label, когда достаточно будет одного Entry.   -  person Bryan Oakley    schedule 27.05.2018


Ответы (1)


Вы сбрасывали списки, используемые для хранения введенных данных каждый раз, когда данные вводились; вам нужно объявить атрибуты хранилища в __init__, а затем использовать их для накопления данных:

class EntryGUI:

    def __init__(self, parent):
        self.cb = IntVar()
        self.job_number_label = Label(parent, text="Job number:")
        self.job_number_label.grid(row=1, column=0)
        self.job_number = Entry(parent)
        self.job_number.focus()
        self.job_number.grid(row=1, column=1)
        self.customer_name_label = Label(parent, text="Customer name:")
        self.customer_name_label.grid(row=2, column=0)
        self.customer_name = Entry(parent)
        self.customer_name.grid(row=2, column=1)
        self.distance_label = Label(parent, text="Distance Travelled (km):")
        self.distance_label.grid(row=3, column=0)
        self.distance = Entry(parent)
        self.distance.grid(row=3, column=1)
        self.min_spent_label = Label(parent, text="Minutes spent on Virus protection:")
        self.min_spent_label.grid(row=4, column=0)
        self.min_spent = Entry(parent)
        self.min_spent.grid(row=4, column=1)
        wof_tune= Checkbutton(parent, variable=self.cb, text="check if WOF and tune is required",
                              onvalue =100, offvalue=0)
        wof_tune.grid(row=5, column=0)
        self.enter = Button(parent, text="Enter Job", command=self.acquire_entries)
        self.enter.grid(row=6, column=0)
        self.show_all = Button(parent, text="Show All")
        self.show_all.grid(row=6, column=1)

        self.job_list = []
        self.customer_list = []
        self.cost_list = []

    def acquire_entries(self):
        self.store_job()
        self.calculate()

    def store_job(self):

        self.job_list.append(self.job_number.get())
        self.customer_list.append(self.customer_name.get())

    def calculate(self):

        self.distance_calc = int(self.distance.get())
        self.min_calc = int(self.min_spent.get())
        self.cost = 0
        # ... unchanged below
person Reblochon Masque    schedule 27.05.2018