'Run a function on button command using tkinter

first of all, I'm a beginner. I have a basic script (get grades()) that takes a .csv file and specific class sections (min 1, max 3). I wrote this function to clean courses grades, and the output is a .txt containing only the student number, class section and grade. This text file is then ready to be upload to a system at my uni.

I'm trying to create a GUI for this script, but I'm stuck. Googling around, I managed to get a basic GUI, but even though I can enter the class sections and browse for a file, I cannot make it run my function. When I click on the button to the get the grades, the GUI crashes. Could you please point me in the right direction? Thank you in advance.

tkinter code

import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo
import tkinter
from tkinter import *
from tkinter import filedialog as fd
from get_grades import get_grades
from functools import partial


# root window
root = tk.Tk()
root.geometry("500x450")
root.title('Grades')

# store sections
sections = tk.StringVar()
file_name = tk.StringVar()


def save_sections():
    """ callback when the sections button clicked
    """
    msg = f'You entered sections: {sections.get()}'
    showinfo(
        title='Information',
        message=msg
    )


# Sign in frame
signin = ttk.Frame(root)
signin.pack(padx=10, pady=10, fill='x', expand=True)

# sections
sections_label = ttk.Label(signin, text="sections:")
sections_label.pack(fill='x', expand=True)

sections_entry = ttk.Entry(signin, textvariable=sections)
sections_entry.pack(fill='x', expand=True)
sections_entry.focus()

# login button
section_button = ttk.Button(signin, text="save sections", command=save_sections)
section_button.pack(fill='x', expand=True, pady=10)


def get_file_name(file_entry):
    file_name = fd.askopenfilename(title="Select file", filetypes=(("CSV Files", "*.csv"),))
    file_entry.delete(0, END)
    file_entry.insert(0, file_name)


entry_csv = Entry(root, text="", width=50)
entry_csv.pack(fill='x', expand=True)

file_label = ttk.Label(root, text="Input CSV")
file_button = ttk.Button(root, text="Browse...", width=10, command=lambda: get_file_name(entry_csv))
file_button.pack(fill='x', expand=True, pady=10)

grades_button = ttk.Button(root, text="Get grades", width=10, command=lambda: get_grades(entry_csv, sections))
grades_button.pack(fill='x', expand=True, pady=10)

# infinite loop
root.mainloop()

get_grades.py

import pandas as pd
from datetime import datetime


def get_grades(file, section1=True, section2=False, section3=False):
    sections = []
    if section1:
        sections.append(section1)
        if section2:
            sections.append(section2)
            if section3:
                sections.append(section3)
    else:
        return "missing sections"
    # get file
    df = pd.read_csv(file)
    # delete the first two rows
    df = df.drop([df.index[0], df.index[1]])
    # important columns are "SIS User ID", "Section", and the name of the test, which changes by course
    # first, rename the assignment column
    df = df.rename(columns={df.columns[5]: "Grade"})
    df = df[df.Student != "Student, Test"]
    # select columns
    df = df[["SIS User ID", "Section", "Grade"]]
    df = df[df['Section'].isin(sections)]
    # cleaning
    df = df.replace("0.0", "NVD")
    df = df.fillna("NA")

    # deleting decimal
    df['SIS User ID'] = df['SIS User ID'].astype(str).apply(lambda x: x.replace('.0', ''))

    # save to txt and csv
    # file name
    date_time = datetime.now().strftime("%Y_%m_%d-%I_%M_%S_%p")
    filename = str(date_time) + "_" + str(sections)
    df.to_csv(str(filename + ' .txt'), sep='\t', index=False)
    print("done! file " + str(filename) + ".txt saved")


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source