【问题标题】:Trying to open image with PIL [duplicate]试图用 PIL 打开图像 [重复]
【发布时间】:2018-04-19 20:01:01
【问题描述】:

我正在尝试使用 PIL 和 tkinter 打开一个文件。我正在使用此代码:

import tkinter as tk
from PIL import Image,ImageTk
from tkinter import *
intWidth=20
intHeight=5

class SampleApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)



        # the container is where we'll stack a bunch of frames
        # on top of each other, then the one we want visible
        # will be raised above the others
        container = tk.Frame(self)
        container.grid(row=0,column=0)#pack(side="top", fill="both", expand=True)



        self.frames = {}
        for F in (StartPage, Departure, PageTwo):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.config(bg='#FBC311')

            # put all of the pages in the same location;
            # the one on the top of the stacking order
            # will be the one that is visible.
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        for row in range(9):
            self.grid_rowconfigure(row, weight=1)
            Button(self,text="Button %d"%(row), bg = '#005ca0', fg = 'white', font = "Verdana 10", width = intWidth, height = intHeight).grid(row = row,column = 0,sticky = E+W)

        for c in range(9):
            self.grid_columnconfigure(c, weight=1)
            Button(self,text="Button %d"%(c), bg = '#005ca0', fg = 'white', font = "Verdana 10", width = intWidth, height = intHeight).grid(row = 5,column = c,sticky = E+W)

        label = tk.Label(self, text="Welkom bij NS", font='Verdana 50', fg='#005ca0', bg='#FBC311')
        label.grid(row=1,column=3,columnspan=3)

        path = "nslogo.png"
        img = ImageTk.PhotoImage(Image.open(path))
        panel = Label(self , image=img, bg = '#FBC311', width = 340)
        panel.photo = img
        panel.grid(column=4, row=2)


        button1 = tk.Button(self, text="Actuele reistijden", command=lambda: controller.show_frame("Departure"),bg='#005ca0', fg='white',width=20,height=5)
        button1.grid(row=6, column=3,sticky='nsew')
        button2 = tk.Button(self, text="Go to Page Two", command=lambda: controller.show_frame("PageTwo"),bg='#005ca0', fg='white',width=20,height=5)
        button2.grid(row=6,column=5,sticky='nsew')

class Departure(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        for row in range(7):
            self.grid_rowconfigure(row, weight=1)
        for c in range(7):
            self.grid_columnconfigure(c, weight=1)
        label = tk.Label(self, text="Actuele vertrektijden", font='Verdana 50', fg='#005ca0', bg='#FBC311')
        label.grid(row=0,column=2,columnspan=5)
        button = tk.Button(self, text="Start",command=lambda: controller.show_frame("StartPage"),bg='#005ca0', fg='white',width=20,height=5)
        button.grid(row=2,column=4)


class PageTwo(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        for row in range(7):
            self.grid_rowconfigure(row, weight=1)
        for c in range(7):
            self.grid_columnconfigure(c, weight=1)
        label = tk.Label(self, text="Storingen", font='Verdana 50', fg='#005ca0', bg='#FBC311')
        label.grid(row=0,column=2,columnspan=5)
        button = tk.Button(self, text="Start", command=lambda: controller.show_frame("StartPage"), bg='#005ca0', fg='white',width=20,height=5)
        button.grid(row=2,column=4)


app = SampleApp()

app.mainloop()

但我得到一个错误:

init 中的文件“C:/Users/kevin/Desktop/HU/Programming/TICT-ViPROG-15/mini_project/test.py”,第 59 行 img = ImageTk.PhotoImage(Image.open(path)) AttributeError:类型对象“图像”没有属性“打开”

我不知道为什么会这样,希望有人能帮助我解决这个问题。

提前致谢。

【问题讨论】:

    标签: python python-imaging-library


    【解决方案1】:

    您有命名空间冲突。而不是做...

    from PIL import Image,ImageTk
    

    尝试做:

    from PIL import ImageTk
    from PIL import Image as PilImage
    

    然后,在您收到错误的那一行中,您将执行以下操作:

    img = ImageTk.PhotoImage(PilImage.open(path))
    

    我希望这会有所帮助。问候。

    【讨论】:

      【解决方案2】:

      问题是由您导入tkinter 模块的方式引起的:

      from PIL import Image,ImageTk
      from tkinter import *
      

      第二次导入将用tkinter 模块中包含的名称替换任何现有的变量、类等名称。碰巧在tkinter 中定义了一个Image 类(它没有open() 方法),因此它将替换已经从PIL 导入的类。

      >> from tkinter import  *
      >>> Image
      <class 'tkinter.Image'>
      

      这说明了为什么最好不要使用import *,尽管使用 Tkinter 这样做很常见。

      解决此问题的一种方法是交换导入的顺序,以便 PIL.Image 替换 tkinter.Image,但如果您想在同一个命名空间中同时使用 tkinter.Image,现在这会阻止您使用两者。

      因此,您可以使用as 为从模块导入的项目定义自己的名称:

      from PIL import ImageTk, Image as PILImage
      

      当您需要PIL.Image 时,请使用PILImage 而不是Image

      【讨论】:

        猜你喜欢
        • 2019-05-12
        • 2019-12-17
        • 1970-01-01
        • 1970-01-01
        • 2015-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多