Как я могу импортировать CSV в графический интерфейс, а затем использовать другие функции для получения более подробной информации

#python #dataframe #user-interface

#питон #фрейм данных #пользовательский интерфейс #python

Вопрос:

Как заголовок, я пытаюсь импортировать CSV в графический интерфейс для работы с ним. К сожалению, при попытке запустить вторую функцию возникает ошибка

Вот код

 window = tk.Tk()
window.geometry("600x600")
window.title("GUI NTV-TRN")

def first_button_function():
    file = filedialog.askopenfile(parent=window,mode='rb',title='Choose a file')
    if file != None:
        data = file.read()
        file.close()

def second_button_function():
    df = data[['MARKET', 'CXR', 'DDATE', 'TYPE', 'FARE', 'DFLIGHT', 'CLASS', 'DATIME']]

first_button = tk.Button(text="Load File", command=first_button_function)
first_button.grid(row=0, column=0)

second_button = tk.Button(text="Cleaning Data", command=second_button_function)
second_button.grid(row=1, column=0)

if __name__ == "__main__":
    window.mainloop()
  

и ошибка при попытке импортировать CSV

 Exception in Tkinter callback
Traceback (most recent call last):
  File "D:Anacondalibtkinter__init__.py", line 1883, in __call__
    return self.func(*args)
  File "<ipython-input-28-a860b1e96a6f>", line 12, in second_button_function
    df = data[['MARKET', 'CXR', 'DDATE', 'TYPE', 'FARE', 'DFLIGHT', 'CLASS', 'DATIME']]
NameError: name 'data' is not defined
  

Я, вероятно, предполагаю, что первая кнопка импортирует фрейм данных, но я могу ошибаться

Спасибо

Ответ №1:

Из того, что я понял, вы вызываете переменную «data» в «second_button_function». Эта переменная создается в предыдущей функции «first_button_function» путем помещения в нее данных файла. Поскольку вы не анализируете переменную вне первой функции, она недоступна для второй функции или даже для остальной части программы. Чтобы исправить это, вы могли бы либо объявить переменную «data» глобально, используя ключевое слово global :

 def first_button_function():
file = filedialog.askopenfile(parent=window,mode='rb',title='Choose a file')
if file != None:
    global data
    data = file.read()
    file.close()
    
  

Или вы могли бы проанализировать его вручную, вернув свою переменную из первой функции и указав в качестве аргумента функций, которым это потребуется. Например:

 def first_button_function():
file = filedialog.askopenfile(parent=window,mode='rb',title='Choose a file')
if file != None:
    data = file.read()
    file.close()
return data
  

Ваша вторая функция function могла бы тогда напоминать:

 def second_button_function(data):
df = data[['MARKET', 'CXR', 'DDATE', 'TYPE', 'FARE', 'DFLIGHT', 'CLASS', 'DATIME']]
  

Но здесь я не уверен, как именно Tkinter вызывает свои функции.
Если вы планируете создавать более сложный графический интерфейс, возможно, вам захочется начать изучать объектно-ориентированный подход. Это значительно облегчает анализ данных с помощью многих функций (или «методов»).

Я надеюсь, что это было полезно! Удачи в ваших приключениях с кодированием.

Комментарии:

1. Большое спасибо за ваш четкий ответ! Это решило мою ошибку, но возникает другая: исключение в трассировке обратного вызова Tkinter (последний последний вызов): File «D:Anacondalibtkinter_ init_ .py», строка 1883, в файле call return self.func (* args) «<ipython-input-42-7d5c1fd9bb36>», строка 20, в second_button_function df = data[[‘MARKET’, ‘CXR’, ‘DDATE’, ‘TYPE’, ‘FARE’, ‘DFLIGHT’, ‘CLASS ‘, ‘ДАТА’]] Ошибка типа: байтовые индексы должны быть целыми числами или срезами, а не списком У вас есть идеи, почему? Спасибо

2. Привет @Shold ! Я рад, что оказал любую помощь! Ну, я думаю, что для того, чтобы помочь вам с этим, мне нужно было бы иметь доступ к вашим данным. Похоже, что вы пытаетесь вызвать имена столбцов со структурой данных, которая ожидает целые числа (например, массив numpy). Вы могли бы попробовать импортировать свои данные, используя pandas и его функцию pandas.read_csv() , которая обычно неплохо справляется с распознаванием имен столбцов и обработкой данных в целом. Или, если вы знаете, какое целое число соответствует какому столбцу (например, данные [0] будут данными [‘MARKET’]), то вы могли бы просто использовать их. Надеюсь, это поможет! 🙂