You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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库实现任意尺寸调整:

  1. 先安装依赖库:pip install pillow
  2. 调整图片大小的示例代码如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:45:01