You need to enable JavaScript to run this app. tkinter使用if条件时图片无法显示、判断逻辑异常问题求解
优惠活动
大模型
产品
解决方案
定价
更多

tkinter使用if条件时图片无法显示、判断逻辑异常问题求解

Tkinter图片不显示+逻辑判断失效问题修复

你的代码共有3个核心问题:

  • 图片对象被Python垃圾回收,导致仅显示空框架无内容
  • 变量作用域错误,导致求和等于4时也永远输出Try again
  • 窗口初始化语法错误,存在运行隐患

问题原因及修复方法

1. 图片被垃圾回收

Tkinter的ImageTk.PhotoImage对象必须保留强引用才能正常显示,函数执行完毕后局部变量存储的图片对象会被自动回收,导致图片不显示。你需要手动给承载图片的Label控件添加属性保存图片引用,比如:

Label2.img = img

2. ent8作用域错误

你在全局定义了ent8=StringVar(),但在code()函数内部又定义了同名的局部Entry控件ent8,外部img()函数读取的始终是未被赋值的全局StringVar,判断逻辑永远不成立。直接把求和用的add变量设为全局,读取add.get()做判断即可。

3. 窗口初始化语法错误

你已经用from tkinter import *导入了所有对象,直接写win = Toplevel()即可,不要加tkinter.前缀,且建议先创建主窗口Tk()再创建子窗口Toplevel避免程序退出异常。


完整可运行修正代码

from tkinter import *
from tkinter import ttk
from PIL import ImageTk, Image

# 先创建主窗口
root = Tk()
root.withdraw() # 隐藏主窗口,只显示业务子窗口
win = Toplevel()

wrapper=Frame(win, bd=4, relief=RIDGE, bg="crimson")
wrapper.place(x=0, y=80, width=465, height=625)
wrapper3=Frame(win, bd=4, relief=RIDGE, bg="crimson")
wrapper3.place(x=950, y=80, width=465, height=625) 
wrapper3_title=Label(wrapper3, text="Selected Data", bg="crimson", fg="white", font=("times new roman",30,"bold"))
wrapper3_title.grid(row=0,column=0,padx=20, pady=10)
wrapper2=Frame(win, bd=4, relief=RIDGE, bg="crimson")
wrapper2.place(x=465, y=80, width=485, height=625) 

# 全局定义add变量供img函数读取
add = StringVar()

def code():
    btn1.destroy()
    global add
    sub=StringVar()
    pro=StringVar()

    img=ImageTk.PhotoImage(Image.open("Amritsar.jpg"))
    Label2= Label(wrapper2, image=img)
    Label2.grid(row=0, column=0, padx=10, pady=5, sticky='w')
    # 保留图片引用避免被回收
    Label2.img = img

    def Find():
        add.set(float(ent00.get())+float(ent01.get()))
        sub.set(float(ent00.get())-float(ent01.get()))
        pro.set(float(ent00.get())*float(ent01.get()))

    ent00=Entry(wrapper, width=15)
    ent00.grid(row=4, column=1, padx=10, pady=10, sticky='w')
    ent01=Entry(wrapper, width=15)
    ent01.grid(row=5, column=1, padx=10, pady=10, sticky='w')

    lbl8=Label(wrapper, text="Add", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=6, column=0, padx=20, pady=10, sticky='w')
    ent8=Entry(wrapper, textvariable=add, width=15, state='readonly')
    ent8.grid(row=6, column=1, padx=10, pady=10, sticky='w')

    lbl15=Label(wrapper, text="Subtract", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=7, column=0, padx=20, pady=10, sticky='w')
    ent15=Entry(wrapper, textvariable=sub, width=15, state='readonly')
    ent15.grid(row=7, column=1, padx=10, pady=10, sticky='w')

    lbl9=Label(wrapper, text="Product", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=8, column=0, padx=20, pady=10, sticky='w')
    ent9=Entry(wrapper, textvariable=pro, width=15, state='readonly')
    ent9.grid(row=8, column=1, padx=10, pady=10, sticky='w')

    btn = Button(wrapper, text = 'Calculate', command=Find, bd = '5', width=15, height=2)
    btn.grid(row=11, column=1, padx=20, pady=10)

def img():  
    if add.get()=="4":
        img_obj=ImageTk.PhotoImage(Image.open("Amritsar.jpg"))
        Label2= Label(wrapper3, image=img_obj)
        Label2.grid(row=0, column=2, padx=10, pady=5, sticky='w')
        # 保留图片引用避免被回收
        Label2.img = img_obj
        print("Move ahead")
    else:
        print("Try again")

btn2 = Button(wrapper, text = 'Image', command=img, bd = '5', width=15, height=2)
btn2.grid(row=12, column=1, padx=20, pady=10)        

btn1 = Button(wrapper, text = 'OPEN CODE', command=code, bd = '5', width=20, height=2)
btn1.grid(row=11, column=1, padx=20, pady=10)

win.geometry("1400x700+250+250")
win.mainloop()

内容的提问来源于stack exchange,提问作者Ricky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 06:36:04