Python 如何将Tkinter条目的数据存储到数据框中,以便以后将其导出到Excel?

Python 如何将Tkinter条目的数据存储到数据框中,以便以后将其导出到Excel?,python,excel,pandas,tkinter,Python,Excel,Pandas,Tkinter,我正在尝试使用Tkinter窗口请求数据条目,然后获取这些条目,将数据存储到Pandas数据框中,然后将数据框导出到Excel。我想存储这些用户条目中的几行数据,并在每个条目之后保存。稍后我想导出存储的数据。但我的问题是,我似乎无法将数据放入数据帧中。我已成功导出Excel文件,但它存储的唯一值为空。有没有一种简单的方法来获取这些值并将它们插入到数据帧中?我对熊猫很熟悉,知道如何出口,但我对Tkinter还是相当陌生的 我尝试过使用insert将数据插入到数据框,我尝试过使用entry.get存

我正在尝试使用Tkinter窗口请求数据条目,然后获取这些条目,将数据存储到Pandas数据框中,然后将数据框导出到Excel。我想存储这些用户条目中的几行数据,并在每个条目之后保存。稍后我想导出存储的数据。但我的问题是,我似乎无法将数据放入数据帧中。我已成功导出Excel文件,但它存储的唯一值为空。有没有一种简单的方法来获取这些值并将它们插入到数据帧中?我对熊猫很熟悉,知道如何出口,但我对Tkinter还是相当陌生的

我尝试过使用insert将数据插入到数据框,我尝试过使用entry.get存储值并将它们传递到数据框,但这些都不起作用。我现在尝试使用get作为值,将它们存储到一个列表中,然后将该列表转换为一个数据帧,但是这些值不会进入数据帧。我没有尝试openpyxl,因为我读过的示例似乎不符合我的想法,这意味着我可以设法导出一个包含示例数据的文件,但不符合代码的实际目的

import tkinter as tk
import pandas as pd

def saveinfo():
    valor = entry1.get()
    list.append(valor)

def export():
    df = pd.DataFrame(list)
    df.to_excel("DataBase.xlsx")

def opennewwindow():
    window.destroy()
    newwindow=tk.Tk()
    newwindow.geometry("500x150")
    newwindow.title("Hi! ")
    titulo = tk.Label(newwindow, text = "Please, enter data: ", font=("Calibri", 10)).grid(column = 0, row = 0)
    textoentry1 = tk.Label(newwindow, text = "Number", font = ("Arial", 8)).grid(column = 0, row = 1)
    entry1 = tk.Entry(newwindow, width=10).grid(column = 1, row = 1)
    textoentry2 = tk.Label(newwindow, text = "Description", font = ("Arial", 8)).grid(column = 0, row = 2)
    entry2 = tk.Entry(newwindow, width=10).grid(column = 1, row = 2)
    textoentry3 = tk.Label(newwindow, text = "Brand", font = ("Arial", 8)).grid(column = 0, row = 3)
    entry3 = tk.Entry(newwindow, width=10).grid(column = 1, row = 3)
    botonguardar = tk.Button(newwindow, text = "Save", command = saveinfo).grid(column = 3, row = 2)
    botonexportar = tk.Button(newwindow, text = "Export", command = export).grid(column = 3, row = 3)
    newwindow.mainloop()


df = pd.DataFrame
list = []

window = tk.Tk()
window.geometry("320x156")
window.title("Master")
label = tk.Label(window, text = "Platform", font = ("Arial", 25)).grid(column = 0, row = 0)
boton = tk.Button(window, text = "Choose an element: ", command = opennewwindow)
boton.grid(column = 0, row = 1)

window.mainloop()
我希望收到一个导出的Excel文件,该文件显示一个数据框,其中包含输入框中写入的值。例如:有3个条目,我想要一个Excel,其中有几行在3列中显示这3个条目:编号、说明和品牌。相反,我得到了一个空白的Excel

我知道我的代码还不干净,自从我试图为我的想法获得一个功能MVP以来,我还没有进行重构或整理。感谢您的任何反馈或想法

First:entry1是仅存在于opennewwindow中的局部变量。您应该在opennewwindow中使用全局entry1来通知此函数,当您使用entry1=

第二:使用entry1=tk.Entry…网格。。。由于grid/pack/place总是返回None,所以您将None分配给entry1。您必须分两步进行:

entry1 = tk.Entry(...)
entry1.grid(...)
代码:

第一:entry1是仅存在于opennewwindow中的局部变量。您应该在opennewwindow中使用全局entry1来通知此函数,当您使用entry1=

第二:使用entry1=tk.Entry…网格。。。由于grid/pack/place总是返回None,所以您将None分配给entry1。您必须分两步进行:

entry1 = tk.Entry(...)
entry1.grid(...)
代码:


只是向您展示如何使用OOP和类来实现它

import tkinter as tk
import pandas as pd

class 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()
如您所见,每个窗口都是一个类。窗口的元素小部件是类的属性,在_init__方法中定义。另外,要存储值的数据列表是类的一个属性。 该类的其他方法用作回调,并且可以自然地访问属性


代码的唯一区别在于,在这里,我不会在显示对话框时破坏主窗口。

只是为了向您展示如何使用OOP和类来完成此操作

import tkinter as tk
import pandas as pd

class 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()
如您所见,每个窗口都是一个类。窗口的元素小部件是类的属性,在_init__方法中定义。另外,要存储值的数据列表是类的一个属性。 该类的其他方法用作回调,并且可以自然地访问属性


代码的唯一区别在于,在这里,当显示对话框时,我不会破坏主窗口。

它不应该与您的错误相关,但list是python中的内置函数。不要将其用作变量。顺便说一下,您应该创建一个类来表示您的gui。这将使所有事情变得更容易。对于你的两个评论来说,这是完全正确的,tbh我当时正在匆忙编写代码,但我应该始终遵循基本原则。感谢您指出这些,我将在重构后修复它。你能解释一下我的输入数据存储问题吗?如果我测试你的代码,我会得到NameError:当我按下保存按钮时,名称“entry1”没有定义。您可以在openwindow函数中定义entry1条目小部件。因此它不在saveinfo名称空间中。但是,您没有报告此错误,因此我不知道代码中到底发生了什么。你确定你发布了所有正在运行的代码吗?嗨!这正是我要解决的问题!请参阅,在“保存”和“导出”按钮之间,我应该可以获得将条目保存到数据框保存并将该数据框导出到Excel文件导出的功能。entry1未在saveinfo命名空间中定义,因为我试图查看是否可以直接调用它,我在前面尝试将其作为参数传递,但没有效果。这个错误代表了我所缺少并试图实现的所有功能。它不应该与您的错误有关,但list是python中的内置函数。不要将其用作变量。顺便说一下,您应该创建一个类来表示您的gui。这将使所有事情变得更容易。对于你的两个评论来说,这是完全正确的,tbh我当时正在匆忙编写代码,但我应该始终遵循基本原则。比
为了指出这些,我将在重构后修复它。你能解释一下我的输入数据存储问题吗?如果我测试你的代码,我会得到NameError:当我按下保存按钮时,名称“entry1”没有定义。您可以在openwindow函数中定义entry1条目小部件。因此它不在saveinfo名称空间中。但是,您没有报告此错误,因此我不知道代码中到底发生了什么。你确定你发布了所有正在运行的代码吗?嗨!这正是我要解决的问题!请参阅,在“保存”和“导出”按钮之间,我应该可以获得将条目保存到数据框保存并将该数据框导出到Excel文件导出的功能。entry1未在saveinfo命名空间中定义,因为我试图查看是否可以直接调用它,我在前面尝试将其作为参数传递,但没有效果。这个错误代表了我所缺乏并试图实现的所有功能。这绝对是完美的!非常感谢你的帮助,我学到了很多,它就像一个符咒。这绝对是完美的!非常感谢你的帮助,我学到了很多东西,这很有魅力。