如何向继承的tkinter Frame类添加新选项?

时间:2017-02-08 11:22:40

标签: python inheritance tkinter

我想为我的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__之前将其删除,但我认为这不是最好的方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

问题是你不仅在for photo循环中使用kwargs,而且还将它传递给

中tkinter.Frame的 init
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)

请确保您的代码也适用于空白照片列表。