Tkinter GUI第二个窗口添加图片报NameError的修复及图片缩放方法
Tkinter双窗口图片显示报错修复及图片调整方案
一、NameError报错修复
报错原因
你遇到的NameError: name 'photo' is not defined由两处代码错误导致:
- Menu类的初始化方法中,你将加载好的图片对象赋值给了变量
img,但后续代码误用了从未定义的变量名photo - 代码中从未定义过
tktext_label变量,强行给该变量赋值image属性属于无效操作 - 额外注意Tkinter的常见坑:如果图片对象是方法内的局部变量,会被Python垃圾回收机制自动清理,最终窗口上会显示空白,必须把图片对象绑定到窗口组件的属性上留存引用。
修复后的完整可运行代码
from tkinter import ttk from tkinter import * root = Tk() root.title('4 Dry Out') # 主窗口图片 img=PhotoImage(file='4 Dry Out Logo.png') Label(root,image=img).pack() root.geometry("275x75") root['bg']='blue' class MainWin: def __init__(self, master): mainFrame = Frame(master) mainFrame.pack() self.titleLabel = Label(master, text="4 Dry Out e-Rental", bg="blue", fg="white", font=("Arial Black", 20)) self.titleLabel.pack() self.Btn = Button(master, text="Water Damage Equipment", command=self.MenuWin, bg="navy", fg="white", font=("Roboto")).pack() def MenuWin(self): self.record = Menu() # 删掉多余的mainloop,全局仅需要根窗口的一个mainloop即可 class Menu: def __init__(self): self.win = Toplevel() self.frameFit = Frame(self.win) self.frameFit.pack() self.frameFit['bg']='blue' # 子窗口图片处理 img=PhotoImage(file='4 Dry Out Logo.png') img_label = Label(self.win,image=img) img_label.pack() img_label.image = img # 绑定图片对象到label属性,防止被回收 self.TitleLabel = Label(self.frameFit, text="e-Rental Portal", bg="blue", fg="white", font=("Arial Black",15)).pack() winStart = MainWin(root) root.mainloop()
二、Tkinter调整图片显示大小的方法
原生Tkinter的PhotoImage仅支持按整数比例缩放图片,灵活度极低,推荐使用Pillow库实现任意尺寸调整:
- 先安装依赖库:
pip install pillow - 调整图片大小的示例代码如下:
from PIL import Image, ImageTk # 加载原图后调整为宽200px、高100px original_img = Image.open('4 Dry Out Logo.png') # 高画质缩放,若Pillow版本低于9.0,将Image.Resampling.LANCZOS替换为Image.LANCZOS resized_img = original_img.resize((200, 100), Image.Resampling.LANCZOS) tk_img = ImageTk.PhotoImage(resized_img) # 放到Label上显示的逻辑和原生PhotoImage一致 img_label = Label(self.win, image=tk_img) img_label.pack() img_label.image = tk_img # 同样需要留存引用防止被回收
如果不想安装第三方库,可以用原生方法按比例调整:
- 缩小为原来的1/2:
img = PhotoImage(file='4 Dry Out Logo.png').subsample(2) - 放大为原来的3倍:
img = PhotoImage(file='4 Dry Out Logo.png').zoom(3)
内容的提问来源于stack exchange,提问作者Lady
相关产品推荐
相关产品推荐

