我想为我的tkinter Frame继承类添加一个新选项。该选项为photos
,必须是网址列表。问题是当我将此选项传递给我的tkinter Frame继承类时,Python引发了一个错误,指出该选项不适用于该小部件。
电话如下:
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 :(得分:0)
问题是你不仅在for photo循环中使用kwargs,而且还将它传递给
中tkinter.Frame的 inittkinter.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)
请确保您的代码也适用于空白照片列表。