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

