Как изменить пользовательский ввод Tkinter - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь создать немного GUI для преобразования файлов Parquet в XLSX. В моем коде в настоящее время я использую tkinter для создания GUI, а затем использую функцию для преобразования из Parquet в XLSX.

Когда я запускаю приведенный ниже код, я все еще получаю сообщение об ошибке, что «myfun c () пропустил 3 обязательных позиционных аргумента:« txt_file »,« txt_name »и« txt_dir »», любая идея почему им не назначают?

import os
import pandas as pd
from tkinter import *
import pyarrow
import shutil
from pathlib import Path

window = Tk()
window.title("Convertor")
#Sets the size of the window
window.geometry('550x200')

#Adds a header to the window and configures the size 
lbl = Label(window, text="Convert Parquet to CSV", font=("Arial Bold", 18))

#Configures where the label message will appear
lbl.grid(column=0, row=0)

#asks for parquet file
lbl2 = Label(window, text="Where is the parquet file currently located?", font=("Arial", 12))
lbl2.grid(column=0, row=1)

#adds a field for an input text message
txt_file = Entry(window,width = 30)
txt_file.grid(column=1, row=1)

#asks for name of xlsx file
lbl3 = Label(window, text="What would you like to call the new xlsx file?", font=("Arial", 12))
lbl3.grid(column=0, row=2)

txt_name = Entry(window,width = 30)
txt_name.grid(column=1, row=2)

#asks where you want to put the new xlsx file
lbl3 = Label(window, text="Where would you like to ouput the xlsx file?", font=("Arial", 12))
lbl3.grid(column=0, row=3)

txt_dir = Entry(window,width = 30)
txt_dir.grid(column=1, row=3)

def myfunc(txt_file, txt_name, txt_dir):
    file = txt_file
    df1 = pd.read_parquet(file)
    df = df1.append(df1, ignore_index=True)
    dirout = txt_dir
    name = txt_name
    cfile = os.path.join(dirout, name + "." + "xlsx")
    df.to_excel(cfile)


#Adding a button
btn = Button(window, text="Convert", command=myfunc)
btn.grid(column=1, row = 4)

#The mainloop causes the window to remain open until someone interacts with it
window.mainloop()

1 Ответ

1 голос
/ 15 января 2020

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

Например:

def my_func():
    file = txt_file.get()
    name = txt_name.get()
    dir_out = txt_dir.get()

    df1 = pd.read_parquet(file)
    df = df1.append(df1, ignore_index=True)
    cfile = os.path.join(dirout, name + "." + "xlsx")
    df.to_excel(cfile)

...

btn = Button(window, text="Convert", command=my_func)

Если вы хотите сделать свой код проще для тестирования, имея код, который выполняет работу, находится в функции, которая принимает параметры, просто переместите этот код в отдельную функцию.

def my_func():
    file = txt_file.get()
    name = txt_name.get()
    dir_out = txt_dir.get()

    do_conversion(file, name, dir_out)

def do_conversion(file, name, dir_out):

    df1 = pd.read_parquet(file)
    df = df1.append(df1, ignore_index=True)
    cfile = os.path.join(dirout, name + "." + "xlsx")
    df.to_excel(cfile)

С этим вы можете использовать do_conversion с или без GUI, что делает его проще написать модульный тест для кода, который выполняет фактическое преобразование.

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