Tkinter中ImageTk.PhotoImage缩放图片后无法显示问题求助
Tkinter缩放后图片无法显示的解决方法
你的代码存在两个关键问题导致缩放后图片无法显示:
- 完整代码中的
select_file函数遗漏了将生成的图片添加到Canvas的步骤(核心函数里有这行,但完整代码里未实现); ImageTk.PhotoImage创建的对象如果是局部变量,会被Python的垃圾回收机制回收,导致Canvas无法引用到图片资源,最终显示空白。
修复方案
- 补充
canvas.create_image代码,将缩放后的图片添加到Canvas; - 通过将
PhotoImage对象绑定到Canvas的属性(或使用全局变量),保持对它的引用,避免被垃圾回收。
修改后的完整代码
from tkinter import * from tkinter import filedialog as fd from PIL import Image, ImageTk # Create a window window = Tk() window.title('Watermarking') window.config(pady=50, padx=50) window['bg'] = '#B3CFF2' filename = '' # ---- Functions ---- # def select_file(): filetypes = [('Image files', '*.jpg'), ('Image files', '*.png'), ('Image files', '*.jpeg')] global filename filename = fd.askopenfilename(title='open a file', initialdir='/', filetypes=filetypes) if not filename: # 处理用户取消选择文件的情况 return canvas.delete("all") img_new = Image.open(filename) r_image = img_new.resize((200, 200)) n_image = ImageTk.PhotoImage(r_image) # 将图片对象绑定到canvas属性,避免被垃圾回收 canvas.image = n_image # 在Canvas中心添加图片 canvas.create_image(100, 100, image=n_image) # ----- UI ------ # # Create Canvas canvas = Canvas(height=200, width=200, bg='skyblue') canvas.grid(column=1, row=0) img = PhotoImage(file='computer-r.png') canvas.image = img # 绑定初始图片的引用 canvas.create_image(100, 100, image=img) # Create Buttons add_img = PhotoImage(file='assests/button_add-image.png') add_img_button = Button(image=add_img, borderwidth=0, bg='#B3CFF2', activebackground="#B3CFF2", command=select_file) add_img_button.grid(column=0, row=0, pady=50) window.mainloop()
补充说明
canvas.image = n_image是核心修复点:把PhotoImage对象挂载到Canvas实例上,让Python保持对该对象的引用,避免被垃圾回收;- 新增的
if not filename: return可以防止用户取消选择文件后,后续代码因空路径报错; - 初始图片也做了同样的引用绑定,确保界面稳定性。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

