如何解决从函数中获取数组而不调用该函数?
我是使用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()
如果您要添加使用xx
,yy
的函数,并且意外地可以在加载数据之前运行该函数,那么最好在开始时创建xx
,yy
并使用一些默认值(例如None
),并在尝试从xx
,{获得值之前,检查函数yy
,None
是否不是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
读取数据之前,应进行检查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。