2017-12-18 183 views
0

我想創建一個有圖片的類,並通過鼠標點擊更改爲下一個類。我是oop的新手,我的想法是使類相似到現實生活中每個新圖片都有新的類實例,是否可以這樣做?這是我的代碼圖片瀏覽類改變鼠標點擊圖片

import tkinter as tk 
from PIL import Image,ImageTk 
class Picture(): 
    _count=1 
    def __init__(self,window): 
     self.id=Picture._count 
     Picture._count+=1 
     self.img=Image.open(r'C:\ImgArchive\img%s.png' % self.id) 
     self.pimg = ImageTk.PhotoImage(self.img) 
     self.lab=tk.Label(window,image=self.pimg) 
     self.lab.pack() 
     self.lab.bind('<1>',self.click) 
    def click(self,event): 
     self.lab.destroy() 
     self=self.__init__(window) 
window = tk.Tk() 
window.title('Album') 
window.geometry('1200x900') 
pic=Picture(window) 
window.mainloop() 

它工作正常,但我不知道我的課的舊實例被刪除,他們?我用self.lab.destroy(),因爲如果我不新圖片顯示了下來,像這樣

#

,而不是這個

#

那麼爲什麼會發生?什麼是高雅它的方式?

+0

命令'自我=自我.__的init __(...)'是代碼的最不尋常的線 - 這意味着你必須更好地組織代碼並將一些代碼從'__init__'移動到分離的方法 - 然後運行這個方法insife'__init__'而不是'self = self .__ init __()' – furas

+0

更好地使用'self。 lab [「image」] = new_image'來替換現有標籤中的圖像。 – furas

+0

我試過這個'def click(self,event): self.lab.destroy() Picture._count + = 1 self.img = Image.open(r'C:\ ImgArchive \ img%s.png'%圖片._count) self.newImg = ImageTk.PhotoImage(self.img) self.lab [「image」] = self.newImg',但得到錯誤'_tkinter.TclError:invalid command name「。!label」'I「對於OOP來說,我的想法是讓類與現實生活類似,每個新圖片都有新的類實例,是否可以做某種方式? –

回答

0

下面的示例生成與C:\Users\Public\Pictures\Sample Pictures路徑測試一個簡單的圖像瀏覽器,讓我知道如果有什麼不清楚:

import tkinter as tk 
from PIL import Image, ImageTk 
#required for getting files in a path 
import os 

class ImageViewer(tk.Label): 
    def __init__(self, master, path): 
     super().__init__(master) 

     self.path = path 
     self.image_index = 0 

     self.list_image_files() 
     self.show_image() 

     self.bind('<Button-1>', self.show_next_image) 

    def list_files(self): 
     (_, _, filenames) = next(os.walk(self.path)) 
     return filenames 

    def list_image_files(self): 
     self.image_files = list() 
     for a_file in self.list_files(): 
      if a_file.lower().endswith(('.jpg', '.png', '.jpeg')): 
       self.image_files.append(a_file) 

    def show_image(self): 
     img = Image.open(self.path + "\\" + self.image_files[self.image_index]) 
     self.img = ImageTk.PhotoImage(img) 
     self['image'] = self.img 

    def show_next_image(self, *args): 
     self.image_index = (self.image_index + 1) % len(self.image_files) 
     self.show_image() 

root = tk.Tk() 

mypath = r"C:\Users\Public\Pictures\Sample Pictures" 
a = ImageViewer(root, mypath) 
a.pack() 

root.mainloop() 
+0

謝謝,這工作正常。現在我看到模式:從Label類繼承,所以我可以使用方法來更改圖片 –