How can I store the data of my Tkinter entries into a DataFrame to later export it to Excel?
First: entry1
is local variable which exists only in opennewwindow
. You should use global entry1
in opennewwindow
to inform this function that it has to use external/global variable when you do entry1 = ...
Second: using entry1 = tk.Entry(...).grid(...)
you assign None
to entry1
because grid()
/pack()
/place()
always return None
. You have to do it in two steps:
entry1 = tk.Entry(...)entry1.grid(...)
Code:
import tkinter as tkimport pandas as pddef saveinfo(): valor1 = entry1.get() valor2 = entry2.get() valor3 = entry3.get() data.append([valor1, valor2, valor3]) print(data)def export(): df = pd.DataFrame(data) df.to_excel("DataBase.xlsx")def opennewwindow(): global entry1 global entry2 global entry3 window.destroy() newwindow = tk.Tk() tk.Label(newwindow, text="Please, enter data: ").grid(column=0, row=0, columnspan=3) tk.Label(newwindow, text="Number").grid(column=0, row=1) entry1 = tk.Entry(newwindow) entry1.grid(column=1, row=1) tk.Label(newwindow, text="Description", ).grid(column=0, row=2) entry2 = tk.Entry(newwindow) entry2.grid(column=1, row=2) tk.Label(newwindow, text="Brand").grid(column=0, row=3) entry3 = tk.Entry(newwindow) entry3.grid(column=1, row=3) tk.Button(newwindow, text="Save", command=saveinfo).grid(column=2, row=2, sticky='we') tk.Button(newwindow, text="Export", command=export).grid(column=2, row=3, sticky='we') newwindow.mainloop()# --- main ---df = pd.DataFramedata = []window = tk.Tk()tk.Label(window, text="Platform").grid(column=0, row=0)tk.Button(window, text="Choose an element: ", command=opennewwindow).grid(column=0, row=1)window.mainloop()
Just to show you how to do it with OOP and classes.
import tkinter as tkimport pandas as pdclass App(tk.Tk): def __init__(self): super(App, self).__init__() self.geometry("320x156") self.title("Master") self.label = tk.Label(self, text = "Platform", font = ("Arial", 25)) self.label.grid(column = 0, row = 0) self.boton = tk.Button(self, text = "Choose an element: ", command = self.opendialog) self.boton.grid(column = 0, row = 1) def opendialog(self): dial = Dialog()class Dialog(tk.Toplevel): def __init__(self): super(Dialog, self).__init__() self.titulo = tk.Label(self, text = "Please, enter data: ", font=("Calibri", 10)) self.titulo.grid(column = 0, row = 0) self.textoentry1 = tk.Label(self, text = "Number", font = ("Arial", 8)) self.textoentry1.grid(column = 0, row = 1) self.entry1 = tk.Entry(self, width=10) self.entry1.grid(column = 1, row = 1) self.textoentry2 = tk.Label(self, text = "Description", font = ("Arial", 8)) self.textoentry2.grid(column = 0, row = 2) self.entry2 = tk.Entry(self, width=10) self.entry2.grid(column = 1, row = 2) self.textoentry3 = tk.Label(self, text = "Brand", font = ("Arial", 8)) self.textoentry3.grid(column = 0, row = 3) self.entry3 = tk.Entry(self, width=10) self.entry3.grid(column = 1, row = 3) self.botonguardar = tk.Button(self, text = "Save", command = self.saveinfo) self.botonguardar.grid(column = 3, row = 2) self.botonexportar = tk.Button(self, text = "Export", command = self.export) self.botonexportar.grid(column = 3, row = 3) self.data = [] def saveinfo(self): valor = self.entry1.get() self.data.append(valor) def export(self): df = pd.DataFrame(self.data) df.to_excel("DataBase.xlsx")window = App()window.mainloop()
As you see, each window is a class. The elements (widgets) of the window are attributes of the class, defined in the __init__
method. Also the data
list where you want to store the values is an attribute of the class.
Other methods of the class are used as callbacks, and have naturally access to the attributes.
The only difference with your code, is that here I do not destroy the main window when the dialog is shown.