尝试使用PIL

时间:2017-11-07 12:06:14

标签: python python-imaging-library

我试图用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()

但我得到一个错误:

文件" C:/Users/kevin/Desktop/HU/Programming/TICT-ViPROG-15/mini_project/test.py",第59行, init     img = ImageTk.PhotoImage(Image.open(path)) AttributeError:type object' Image'没有属性'打开'

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

您遇到名称空间冲突。而不是......

from PIL import Image,ImageTk

尝试做:

from PIL import ImageTk
from PIL import Image as PilImage

然后,在您收到错误的行中,您将会:

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

我希望有所帮助。问候。

答案 1 :(得分:1)

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

from PIL import Image,ImageTk
from tkinter import *

第二个导入将用tkinter模块中包含的变量,类等替换现有的变量,类等名称。恰好在Image中定义了tkinter类(没有open()方法),因此它将替换已从{{1}导入的类}}

PIL

这表明为什么最好不要使用>> from tkinter import * >>> Image <class 'tkinter.Image'> ,尽管通常使用Tkinter这样做。

解决此问题的一种方法是交换导入的顺序,以便import *替换PIL.Image,但如果您想要同时使用tkinter.Image,则会阻止您使用tkinter.Image相同的命名空间。

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

from PIL import ImageTk, Image as PILImage

并在需要PILImage时使用Image代替PIL.Image