Tkinter实现选择文件后显示文件名,解决filename变量跨函数调用报错
问题根因
filename是UploadAction函数内部的局部变量,作用域仅限于函数内部,外部直接调用会触发未定义报错- 原代码在窗口初始化阶段就执行了
create_text创建文本,此时用户还未选中文件,就算变量可访问也拿不到有效值 - 额外错误:
canvas.create_text不支持relx、rely参数,这两个是控件place布局的参数,canvas绘图默认使用像素坐标
修正后可运行代码
import tkinter as tk from tkinter import filedialog from tkinter.constants import CENTER def UploadAction(event=None): filename = filedialog.askopenfilename() print('Selected:', filename) # 选中文件后动态更新文本内容 canvas1.itemconfig(text_id, text=filename) root = tk.Tk() canvas1 = tk.Canvas(root, width=300, height=300) canvas1.pack() button1 = tk.Button(text='点击选择文件', command=UploadAction, bg='brown', fg='white') # 居中放置按钮 canvas1.create_window(150, 150, window=button1) # 预先创建空文本,保存id供后续修改,坐标210对应按钮下方位置 text_id = canvas1.create_text(150, 210, anchor=CENTER, text="", fill="black", font=('Helvetica 15 bold')) root.mainloop()
调整说明
- 窗口初始化阶段预先在按钮下方创建空文本组件,保存该组件的id用于后续内容修改
- 把更新文件名的逻辑放到按钮回调函数里,用户选中文件后直接调用
canvas.itemconfig()方法修改文本内容,不需要跨函数传递变量 - 移除了按钮重复的布局调用,
create_window已经可以实现居中放置,无需额外调用place方法
内容的提问来源于stack exchange,提问作者Максим Александров
相关产品推荐
相关产品推荐

