Как я могу сохранить данные моих записей Tkinter в DataFrame для последующего экспорта в Excel? - PullRequest
1 голос
/ 13 октября 2019

Я пытаюсь использовать окно Tkinter для запроса ввода данных, затем взять эти записи, сохранить данные в Pandas DataFrame и затем экспортировать DataFrame в Excel. Я хочу сохранить несколько строк данных из этих записей пользователя и сохранять после каждой записи. Позже я хочу экспортировать сохраненные данные. Но моя проблема в том, что я не могу получить данные в DataFrame. Мне удалось экспортировать файл Excel, но единственное значение, которое он сохранил, было пустым. Есть ли простой способ получить эти значения и вставить их в DataFrame? Я знаком с Pandas и знаю, как экспортировать, но я довольно плохо знаком с Tkinter.

Я пытался вставить данные с помощью insert () в DataFrame, я пытался использовать entry.get () для хранения значений и передачи их в DataFrame, но ни один из них не сработал. Теперь я попытался использовать get () для значений, сохранить их в списке, а затем превратить этот список в DataFrame, но значения просто не попадут в DataFrame. Я не пробовал 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, в котором показан DataFrame со значениями, которые были записаны в полях ввода. Например: есть 3 записи, и я хочу Excel с несколькими строками, которые показывают эти 3 записи в 3 столбцах: «Номер», «Описание» и «Бренд». Вместо этого я получаю чистый Excel.

Я знаю, что мой код еще не очищен, я не подвергался рефакторингу и не убирал, так как я пытаюсь получить функциональный MVP для моей идеи. Спасибо за любые отзывы или идеи!

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Первое: entry1 - локальная переменная, которая существует только в opennewwindow. Вы должны использовать global entry1 в opennewwindow, чтобы сообщить этой функции, что она должна использовать внешнюю / глобальную переменную, когда вы делаете entry1 = ...

Секунда: используя entry1 = tk.Entry(...).grid(...), вы назначаете None для entry1потому что grid() / pack() / place() всегда возвращают None. Это нужно сделать в два этапа:

entry1 = tk.Entry(...)
entry1.grid(...)

Код:

import tkinter as tk
import pandas as pd

def 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.DataFrame
data = []

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()
0 голосов
/ 15 октября 2019

Просто чтобы показать вам, как это сделать с ООП и классами.

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__. Также список data, в котором вы хотите сохранить значения, является атрибутом класса.
Другие методы класса используются в качестве обратных вызовов и имеют естественный доступ к атрибутам.

Единственное отличиес вашим кодом, это то, что здесь я не разрушаю главное окно, когда отображается диалоговое окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...