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
相关产品推荐
相关产品推荐

