Tkinter设置iconphoto报错pyimage1不是照片图像,如何解决?
报错原因分析
- 导入冲突:先后导入了两次
filedialog,第二次from file_dialog import filedialog直接覆盖了tkinter原生的文件对话框对象,属于无效冗余导入,会引发后续调用异常。 - 图标加载方式错误:原生Tkinter的
PhotoImage对PNG格式支持性差,多数低版本Tkinter无法直接识别PNG文件作为图标,你已经导入了PIL库却没有用对应的ImageTk.PhotoImage加载图标,导致iconphoto方法识别不到合法的图片对象。 - 代码执行逻辑错误:
root.mainloop()是窗口渲染的阻塞方法,写在它后面的按钮创建、文件对话框调用代码,必须等窗口完全关闭后才会执行,运行窗口阶段这些代码根本不会生效。 - 自定义函数逻辑错误:
file_dialog_button函数中app = app.tk()属于无效代码,pack()方法不需要传入父容器作为参数,函数调用时也没有传入root参数,会直接报错。
修复后的完整代码
from tkinter import * from PIL import ImageTk, Image from tkinter import filedialog root = Tk() # 用PIL的ImageTk加载PNG图标,兼容所有Tkinter版本 img = ImageTk.PhotoImage(Image.open('icon.png')) root.geometry("700x500") # 应用窗口尺寸 root.iconphoto(False, img) # 应用图标 root.title("I need a NAME!") # 窗口标题 def file_dialog(): root.filename = filedialog.askopenfilename(initialdir="Downloads", title="Select A File To Start", filetypes=(("mp4 files", "*.mp4"),("mov files", "*.mov"),("png files", "*.png"),("jpeg files", "*.jpeg"),("jpg files", "*.jpg"))) def file_dialog_button(app): button = Button(app, text="Start!", command=file_dialog) button.pack() # 窗口启动前先创建按钮 file_dialog_button(root) root.mainloop() print("Succesful Build")
内容的提问来源于stack exchange,提问作者Dinu
相关产品推荐
相关产品推荐

