从函数中获取数组而不调用该函数?

问题描述

我是使用tkinter编写gui的Python初学者。 我有一个按钮,它调用一个函数来打开一个csv文件并读取它, 那么我想从该函数获取文件中的值,以在另一个函数中使用它。如下面的示例代码所示,我使用return [XX,YY]语句取出数组,然后分配它们(XX,YY = Read_CSV())。尽管这可行,但是问题是当我运行代码时,在单击按钮之前,会弹出打开对话框。那是因为在XX,YY = Read_CSV()中我正在调用一个仅在单击按钮时才应调用函数

如何在不调用函数的情况下分配这些数组并将其从函数删除

from tkinter import *
import pandas as pd
from tkinter import filedialog

root = Tk()
root.geometry('200x200')
Frame=LabelFrame(root,text='Frame').pack()

def Read_CSV():
    CSV_File_Name = filedialog.askopenfilename(initialdir='/Desktop',title='Select Data File',filetypes=(('All files','*.*'),('CSV file','*.csv')))

    Data_CSV = pd.read_csv(CSV_File_Name,names=["A","B"])

    XX = (Data_CSV['A']);
    YY = (Data_CSV['B'])

    return [XX,YY]


XX,YY = Read_CSV()
print(XX)

CSV_Read_Button = Button(Frame,text='Load Data',command=Read_CSV)
CSV_Read_Button.pack()

root.mainloop()

解决方法

首先:不要使用XX,YY = Read_CSV(),因为它可以一次运行代码-但您不需要它。

第二个问题:问题是,当您按下按钮并运行函数时,它并不在乎用return发送的内容,因为它不知道如何处理这些值(您无法告知按钮,它必须将其分配给XX,YY),此时您需要global将值直接分配给外部变量。

import tkinter as tk
from tkinter import filedialog
import pandas as pd

# --- functions ---

def read_csv():
    global xx  # use external variable instead of local one
    global yy  # use external variable instead of local one
    
    filename = filedialog.askopenfilename(initialdir='/Desktop',title='Select Data File',filetypes=(('All files','*.*'),('CSV file','*.csv')))


    if filename: # when user use `Cancel` then `filename will be `None`
        data = pd.read_csv(filename,names=["A","B"])
        xx = data['A']  # it will assign to external variable
        yy = data['B']  # it will assign to external variable

    print(xx,yy)

# --- main ---

xx = None  # default value at start
yy = None  # default value at start

root = tk.Tk()

frame = tk.LabelFrame(root,text='Frame')
frame.pack() # you have to do in separated line because `frame = tk.LabelFrame().pack()` gives `None` in `frame`

csv_read_button = tk.Button(frame,text='Load Data',command=read_csv)
csv_read_button.pack()

root.mainloop()

如果您要添加使用xxyy的函数,并且意外地可以在加载数据之前运行该函数,那么最好在开始时创建xxyy并使用一些默认值(例如None),并在尝试从xx,{获得值之前,检查函数yyNone是否不是xx {1}}


这样做的时候

yy

然后将frame = tk.LabelFrame(root,text='Frame').pack() 分配给None,因为frame / pack() / grid()返回place()。您必须分两行将小部件分配给变量。

None

frame = tk.LabelFrame(root,text='Frame') frame.pack() 中,某人可以单击filedialog,然后Cancel将是filename,因此在尝试使用None读取数据之前,应进行检查。


请参见PEP 8 -- Style Guide for Python Code