2017-02-08 4 views
2

Я хотел бы добавить новую опцию в свой унаследованный класс tkinter Frame. Этот параметр будет photos и должен быть списком URL-адресов. Проблема в том, что когда я передаю эту опцию в мой унаследованный класс tkinter Frame, Python поднимает ошибку, говоря, что этот параметр недоступен для этого виджета.Как добавить новую опцию в унаследованный класс кадров 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) 

Моя первая идея состояла в том, чтобы не пройти *args, **kwargs к Frame.__init__, но потом, когда я прохожу другой кадр варианты, такие как width, конечно, эта опция больше не учитывается.

Моя вторая идея состояла в том, чтобы получить опцию в **kwargs и удалить ее перед вызовом Frame.__init__, но я не вижу в этом лучшего способа сделать это.

Любые идеи?

ответ

0

Проблема заключается в том, что вы используете 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) 

Сделайте так, чтобы ваш код работал и для пустого списка фотографий.