【问题标题】:How to solve the error "AttributeError: type object 'Image' has no attribute 'open'" in python?如何解决python中的错误“AttributeError:类型对象'Image'没有属性'open'”?
【发布时间】:2019-04-22 13:00:03
【问题描述】:

我试图在 Tkinter 画布中显示图像以及一些文本,但遇到以下错误。此外,在 anaconda 中使用 Spyder 运行时,我的 mac 不显示按钮的背景颜色(Spyder 最新版本)。

我的python代码是:

from tkinter import *  
from PIL import ImageTk,Image  

def plot_best_batsmen():
    best_batsmen = dataset.loc[dataset.loc[dataset['Innings']>=15,'Average'].idxmax(),'Names']
    message = ("The best Batsman of the Tournament could possibly be: ", best_batsmen)
    canvas_width = 500
    canvas_height = 500
    root = Tk()
    root.geometry("600x600")
    root.title("New Window")
    canvas = Canvas(root, width=canvas_width, height=canvas_height)
    canvas.create_text(1, 10, anchor=W, text=message)
    img = ImageTk.PhotoImage(Image.open("prediction.jpg"))
    canvas.create_image(20, 20, anchor=NW, image=img)
    canvas.image = img
    canvas.pack()
    root.mainloop()

运行时显示如下错误信息:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/anaconda3/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "/Users/vivekchowdary/Documents/PS3_Final_Project/Batsmen.py", line 110, in plot_best_batsmen
    canvas.create_image(20, 20, anchor=NW, image=img)
  File "/anaconda3/lib/python3.7/tkinter/__init__.py", line 2489, in create_image
    return self._create('image', args, kw)
  File "/anaconda3/lib/python3.7/tkinter/__init__.py", line 2480, in _create
    *(args + self._options(cnf, kw))))
_tkinter.TclError: image "pyimage3" doesn't exist

按钮代码如下:

b1 = Button(root, text="Elbow Method", command=plot_elbow, bg="green", fg="white").pack(side = LEFT)
b2 = Button(root, text="K-Means Clustering", command=plot_kmeans, bg="blue", fg="white").pack(side = LEFT)
b3 = Button(root, text="Batsmen who scored 4 or more Hundreds", command=plot_hundreds, bg="#D35400", fg="white").pack(side = LEFT)
b4 = Button(root, text="Runs Scored by Various Players", command=plot_runs, bg="#117A65", fg="white").pack(side = LEFT)
b5 = Button(root, text="Best Batsmen", command=plot_best_batsmen, bg="#34495E", fg="white").pack(side = LEFT)
b6 = Button(root, text="Stop", command=root.destroy, bg="red", fg="white").pack(side = BOTTOM)

我希望 Tkinter 显示以下图像。但它正在报告错误。谁能帮我解决这个错误?

【问题讨论】:

标签: python python-3.x tkinter python-imaging-library tkinter-canvas


【解决方案1】:

tkinter 还有一个名为 Image 的类/函数。您还从 PIL 导入了图像。您需要确定您尝试使用哪个 Image.open。 tkinter.Image 没有“打开”属性。

【讨论】:

    【解决方案2】:

    似乎该错误与您的 tkinter 无关。要找出问题,请您

    from PIL import Image 
    print(Image.open)
    

    如果您已正确安装所有内容,结果应如下所示。

    < function open at 0x0000000008A26488 >
    

    【讨论】:

    • 是的,当我输入上述代码时,它会打印&lt;function open at 0x105928b70&gt;
    • 如果它将Image.open 显示为一个函数(在您使用该函数之前),那么它应该可以工作。除非,您已经完成 from tkinter import * 并覆盖了第一次导入。一般来说,导入时不要使用通配符,你不知道你导入了什么。
    【解决方案3】:

    我自己想出了答案,只是想分享它以帮助有同样疑问的人。

    我们需要在 Tkinter 之后导入 PIL,因为 Tkinter 也有自己的类 Image,它没有“打开”功能,如果在 PIL 之后导入,来自 Tkinter 的这个 Image 会替换来自 PIL 的 Image。

    第二件必须做的事情是将root = Tk()替换为root = Toplevel(),因为问题是当Python/Tkinter试图从按钮构建画布时,它实际上是试图在根目录下创建两个窗口并下降结束了。

    现在,代码正在将照片导入 GUI 并且工作正常。

    所以,下面的代码终于可以正常工作了: def plot_best_batsmen(): best_batsmen = dataset.loc[dataset.loc[dataset['Innings']>=15,'Average'].idxmax(),'Names'] message = ("The best Batsman of the Tournament could possibly be: ",best_batsmen) canvas_width = 400 canvas_height = 500 root = Toplevel() root.geometry("700x600") root.title("New Window") canvas = Canvas(root, width=canvas_width, height=canvas_height) canvas.create_text(1, 10, anchor=W, text=message) img = ImageTk.PhotoImage(Image.open("virat.jpg")) canvas.create_image(150, 20, anchor=NW, image=img) canvas.image = img canvas.pack() root.mainloop()

    【讨论】:

    • 你在说你自己想通之前有没有检查其他答案?
    猜你喜欢
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2019-08-11
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2021-01-14
    相关资源
    最近更新 更多