2017-02-08 1 views
2

tkinter 프레임 상속 된 클래스에 새 옵션을 추가하고 싶습니다. 이 옵션은 photos이고 URL 목록이어야합니다. 문제는이 옵션을 tkinter Frame 상속 클래스에 전달할 때 파이썬이 해당 위젯에 옵션을 사용할 수 없다는 오류를 발생시키는 것입니다.상속받은 tkinter 프레임 클래스에 새 옵션을 추가하려면 어떻게해야합니까?

호출은 다음

self.photos = [url1, url2, url3] 
self.slideshow_photos = SlideShow(self, width=320, photos=self.photos) 

그리고 내 클래스는 다음과 같다 :

class SlideShow(tkinter.Frame): 
    def __init__(self, master=None, *args, **kwargs): 
     tkinter.Frame.__init__(self, master, *args, **kwargs) 

     self.master = master 

     self.grid() 

     self.photos = [] 
     for photo in kwargs.get('photos', []): 
      self.photos.append(ImageTk.PhotoImage(Image.open(io.BytesIO(urlopen(photo).read())))) 

     self.label_photo = tkinter.Label(self, image=self.photos[0]) 
     self.label_photo.photo = self.photos[0] 
     self.label_photo.grid(column=1, row=1) 

내 첫번째 생각은 Frame.__init__-*args, **kwargs하지만를 통과하지하는 것이었다 나는 다른 프레임을 통과 할 때 옵션 (예 : width)은이 옵션을 더 이상 고려하지 않습니다.

두 번째 아이디어는 **kwargs의 옵션을 가져와 Frame.__init__을 호출하기 전에 해당 옵션을 삭제했지만 가장 좋은 방법이라고 생각하지 않습니다.

아이디어가 있으십니까?

답변

0

문제는 당신이 사진 for 루프에서뿐만 아니라 kwargs로를 사용하지만 tkinter.Frame 사진의 경우

tkinter.Frame.__init__(self, master, *args, **kwargs) 

초기화 tkinter.Frame의에 전달하는 유효한 키워드 인수되지이다 따라서 모든 것이 실패합니다. 잠재적 인 해결책은

class SlideShow(tkinter.Frame): 
    def __init__(self, master=None,photo_urls=[], *args, **kwargs): 
     tkinter.Frame.__init__(self, master, *args, **kwargs) 

     self.master = master 

     self.grid() 

     self.photos = [] 
     for url in photo_urls: 
      self.photos.append(ImageTk.PhotoImage(Image.open(io.BytesIO(urlopen(url).read())))) 

     self.label_photo = tkinter.Label(self, image=self.photos[0]) 
     self.label_photo.photo = self.photos[0] 
     self.label_photo.grid(column=1, row=1) 

입니다. 그러나 코드가 빈 사진 목록에도 적용되도록하십시오.

관련 문제