2017-11-07 7 views
0

PILとtkinterでファイルを開こうとしています。PILで画像を開こうとしています

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(パス)) はAttributeError:タイプのオブジェクトの画像 'には属性「オープン」を持っていない

私はなぜこれが起こっていると期待していた見当がつかない誰かがこの問題で私を助けてくれます。

ありがとうございます。

答えて

1

名前空間が競合しています。代わりに行うの...

from PIL import Image,ImageTk 

はやってみます

from PIL import ImageTk 
from PIL import Image as PilImage 

をし、その後、あなたがエラーを取得しているラインでは、あなたがやる:

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

私は願っていますそれは助ける。よろしく。第二インポートがtkinterモジュールに含まれるものと変数、クラスなどの既存の名前を置き換えます

from PIL import Image,ImageTk 
from tkinter import * 

1

問題は、あなたがtkinterモジュールをインポートする方法が原因です。 tkinteropen()メソッドを持たない)に定義されたImageクラスが存在するため、すでにインポートされたクラスはPILに置き換えられます。

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

Tkinterのとそうするのが一般的ですが、import *を使用しないことが好ましい理由のデモンストレーションです。

これを解決する1つの方法は、PIL.Imagetkinter.Imageを置き換えるようにインポートの順序を入れ替えることですが、同じ名前空間で両方を使用したい場合はtkinter.Imageを使用できなくなります。

from PIL import ImageTk, Image as PILImage 

を、あなたがPIL.Imageを必要とする場合Imageの代わりにPILImageを使用します。

だから、あなたはモジュールからインポートアイテムのために自分の名前を定義するasを使用してインポートすることができます。

関連する問題