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

Tkinter使用图片作按钮报错__str__ returned non-string(JpegImageFile)如何解决?

Tkinter图片按钮错误解决方法

错误原因

  • TypeError问题:tkinter原生的PhotoImage仅支持PNG、GIF等有限格式,无法直接处理JPG。你错误地用它包裹了PIL的Image.open()返回的JpegImageFile对象,导致类型不兼容,必须用PIL提供的ImageTk.PhotoImage来处理JPG图片。
  • Pyimage1 Not found问题:Tkinter应用只能存在一个主Tk()实例,你在menufun里新建了第二个Tk()窗口,导致图片资源的上下文混乱,应该用Toplevel()创建子窗口。
  • 隐性问题:PIL生成的图片对象需要保持引用(比如绑定到窗口或控件的属性),否则会被Python垃圾回收机制回收,导致图片无法显示。

修正后的代码

from tkinter import *
from PIL import ImageTk, Image

# 主窗口设置
mainwindow = Tk()
mainwindow.geometry('420x420')
mainwindow.title('Root Screen')

# 加载按钮图片(用ImageTk.PhotoImage处理JPG)
temp_img = ImageTk.PhotoImage(Image.open('D:\\Coding\\Python_stuff\\Watch_T800\\temp_img.jpg'))
# 保持图片引用(绑定到主窗口属性)
mainwindow.temp_img = temp_img
temp_img_lbl = Label(mainwindow, image=temp_img)
temp_img_lbl.pack()

# 菜单窗口函数:用Toplevel创建子窗口
def menufun():
    menuwindow = Toplevel(mainwindow)
    menuwindow.geometry('420x420')
    menuwindow.title('Menu')
    
    temp = Button(menuwindow, text="Temperature", height=5, width=10, image=temp_img)
    temp.grid(row=0, column=0)
    # 子窗口也保持图片引用
    menuwindow.temp_img = temp_img

# 主窗口按钮
menu_btn = Button(mainwindow, text="Menu", command=menufun)
menu_btn.pack()

# 加载背景图片
bg = Image.open('D:\\Coding\\Python_stuff\\Watch_T800\\background.png')
blah1 = ImageTk.PhotoImage(bg)
mainwindow.blah1 = blah1  # 保持背景图引用
lbl = Label(mainwindow, image=blah1)
lbl.pack()

mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:55:16