如何将Python Tkinter上传函数获取的文件名传递到计算函数使用
问题核心原因
- 原代码里的
global filename只是全局域的声明,没有在Upload函数内部指定使用全局变量,导致Upload里赋值的filename/path都是局部变量,Calc函数无法访问 - 缺少
openpyxl.load_workbook的导入语句,运行时会触发名称报错
修正方案
我们可以直接把选中的文件路径存为全局变量,两个函数共享这个变量即可,修正后完整代码如下:
import tkinter as tk from tkinter import Label, filedialog from tkinter.constants import CENTER, LEFT from pathlib import Path # 补全load_workbook导入 from openpyxl import load_workbook import os # 声明全局变量存储选中的文件完整路径 selected_file_path = None def Upload(): global selected_file_path # 加文件类型过滤,避免选到非Excel文件 filename = filedialog.askopenfilename(filetypes=[("Excel文件", "*.xlsx *.xls")]) # 处理用户取消选文件的情况 if not filename: return selected_file_path = Path(filename) # 展示文件名 label2 = Label(text=selected_file_path.name, font="Arial 17", justify=LEFT) label2.place(relx=0.35, rely=.13) def Calc(): global selected_file_path # 先判断有没有选中文件,避免空指针报错 if not selected_file_path or not selected_file_path.exists(): print("请先选择有效的Excel文件") return workbook = load_workbook(filename=selected_file_path) # 下方自行补充Excel处理逻辑即可 root= tk.Tk() canvas1 = tk.Canvas(root, width = 300, height = 300) canvas1.pack() button1 = tk.Button(text='Open File',command=Upload, bg='purple',fg='white') button1.place (relx = 0.5, rely = 0.5, anchor=CENTER) button2 = tk.Button(text='Calculate',command=Calc, bg='purple',fg='white') button2.place (relx = 0.5, rely = 0.6, anchor=CENTER) label1 = Label(text= 'Выбраный файл:', fg="#eee", bg="#333") label1.place(relx = 0.5, y=20, anchor=CENTER) canvas1.create_window(150, 150, window=button1) root.mainloop()
改动说明
- 新增全局变量
selected_file_path存储选中的文件完整路径,在Upload和Calc内部都用global关键字声明使用该全局变量,实现参数传递 - 补全了
load_workbook的导入,增加了Excel文件类型过滤、用户取消选文件、文件不存在的异常判断,避免运行报错 - 直接用完整路径加载Excel,不会出现因为只有文件名找不到文件的问题
内容的提问来源于stack exchange,提问作者Максим Александров
相关产品推荐
相关产品推荐

