Tkinter双文件上传后content变量无法被外部访问的问题修复
问题根因
报错本质是Python变量作用域规则导致的:你在uploadFiles()函数内部给content、content2赋值时,没有声明为全局变量,这两个值默认是函数局部变量,仅能在uploadFiles()函数内部访问,函数执行结束后局部变量就会被回收。等Tkinter窗口销毁、代码走到外部解析逻辑时,全局作用域下不存在这两个变量,自然触发未定义报错。
另外原代码还存在三个隐性问题:一是没有导入pandas库,变量问题修复后调用pd.json_normalize会二次报错;二是打开文件读取后没有关闭文件句柄;三是解析函数parse_value会漏掉文件末尾最后一组记录。
修复方案
- 在
uploadFiles()函数内用global关键字声明content、content2为全局变量,让函数外部的解析逻辑可以读取到文件内容 - 代码开头补上
pandas库的导入语句 - 增加基础校验,避免用户未选全文件就点击上传触发异常
- 补全文件句柄关闭逻辑、解析函数末尾记录的处理逻辑
修改后可直接运行的完整代码如下:
from tkinter import * from tkinter.ttk import * from tkinter.filedialog import askopenfile import pandas as pd ws = Tk() ws.title('PythonGuides') ws.geometry('400x200') # 初始化全局变量,避免未选文件时触发异常 file1 = "" file2 = "" content = "" content2 = "" def open_file1(): file_path = askopenfile(mode='r', filetypes=[('All files', '*')]) if file_path is not None: global file1 file1 = file_path.read() file_path.close() def open_file2(): file_path = askopenfile(mode='r', filetypes=[('All Files', '*')]) if file_path is not None: global file2 file2 = file_path.read() file_path.close() def uploadFiles(): global content, content2 if not file1 or not file2: print("请先选择两个目标文件再点击上传") return content = file1 content2 = file2 ws.destroy() adhar = Label(ws, text='Upload File 1 ') adhar.grid(row=0, column=0, padx=10) adharbtn = Button(ws, text='Choose File', command=lambda: open_file1()) adharbtn.grid(row=0, column=1) dl = Label(ws, text='Upload File 2 ') dl.grid(row=1, column=0, padx=10) dlbtn = Button(ws, text='Choose File ', command=lambda: open_file2()) dlbtn.grid(row=1, column=1) upld = Button(ws, text='Upload Files', command=uploadFiles) upld.grid(row=3, columnspan=3, pady=10) ws.mainloop() def parse_value(txt): reclines = [] for line in txt.split('\n'): if ':' not in line: if reclines: yield reclines reclines = [] else: reclines.append(line) # 处理文件末尾最后一组记录 if reclines: yield reclines def parse_fields(reclines): res = {} for line in reclines: key, val = line.strip().rstrip(',').split(':', 1) res[key.strip()] = val.strip() return res res = [] for rec in parse_value(content): res.append(parse_fields(rec)) res2 = [] for rec in parse_value(content2): res2.append(parse_fields(rec)) df = pd.json_normalize(res) df2 = pd.json_normalize(res2) # 输出解析结果 print("=== 第一个文件解析结果 ===") print(df) print("\n=== 第二个文件解析结果 ===") print(df2)
原运行报错截图:
内容的提问来源于stack exchange,提问作者gcoder
相关产品推荐
相关产品推荐

