Python(Pandas、Tkinter):askopenfilename获取路径后读取Excel报错
解决Tkinter获取Excel路径后Pandas读取报错的问题
错误原因
报错NameError: name 'xlsx' is not defined是因为xlsx是select_file函数内部的局部变量,read_excelr函数无法访问该变量,导致找不到这个名称。
解决方法
方法1:将xlsx作为参数传递给read_excelr(推荐)
修改select_file调用read_excelr时传入xlsx,同时修改read_excelr的参数定义,确保变量能正确传递:
import tkinter as tk from tkinter import ttk from tkinter import filedialog as fd from tkinter.messagebox import showinfo import pandas as Pds # 创建主窗口 root = tk.Tk() root.title('读取Excel') root.resizable(False, False) root.geometry('750x150') lbl1 = tk.Label(root, text="选择Excel文件") lbl1.grid(column=0,row=0) def select_file(): filetypes = (('Excel文件', '*.xlsx'),('文本文件', '*.txt')) filename = fd.askopenfilename(title='打开文件',initialdir='/',filetypes=filetypes) if not filename: # 处理用户取消选择的情况 return showinfo(title='已选文件',message=filename) lbl2['text']=filename print(filename) xlsx = Pds.ExcelFile(filename) read_excelr(xlsx) # 传入xlsx参数 def read_excelr(xlsx): # 接收参数 df=Pds.read_excel(xlsx) print(df) # 打开文件按钮 open_button = ttk.Button(root,text='打开文件',command=select_file) open_button.grid(column=1, row=0) # 文件路径显示标签 lbl2 = tk.Label(root, text='未选择文件') lbl2.grid(column=2,row=0) # 运行程序 root.mainloop()
方法2:将xlsx声明为全局变量
在select_file里把xlsx定义为全局变量,让read_excelr可以直接访问:
def select_file(): global xlsx # 声明全局变量 filetypes = (('Excel文件', '*.xlsx'),('文本文件', '*.txt')) filename = fd.askopenfilename(title='打开文件',initialdir='/',filetypes=filetypes) if not filename: return showinfo(title='已选文件',message=filename) lbl2['text']=filename print(filename) xlsx = Pds.ExcelFile(filename) read_excelr() def read_excelr(): df=Pds.read_excel(xlsx) print(df)
注意:全局变量会增加代码耦合度,不推荐在复杂程序中使用。
方法3:合并函数逻辑
直接在select_file里完成Excel读取,不需要单独的read_excelr函数,简化代码结构:
def select_file(): filetypes = (('Excel文件', '*.xlsx'),('文本文件', '*.txt')) filename = fd.askopenfilename(title='打开文件',initialdir='/',filetypes=filetypes) if not filename: return showinfo(title='已选文件',message=filename) lbl2['text']=filename print(filename) # 直接读取Excel文件 df=Pds.read_excel(filename) print(df)
额外优化说明
- 添加了用户取消选择文件的判断,避免空路径导致后续代码报错
- 将文件类型描述改为中文,更符合日常使用习惯
内容的提问来源于stack exchange,提问作者Pera Wo
相关产品推荐
相关产品推荐

