繁体   English   中英

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

[英]How can I add a new option to an inherited tkinter Frame class?

我想在我的tkinter Frame继承类中添加一个新选项。 该选项将是photos ,并且必须是URL列表。 问题是当我将此选项传递给我的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__传递给Frame.__init__但是当我传递其他Frame选项(例如width ,当然不再考虑此选项了。

我的第二个想法是在调用Frame.__init__之前在**kwargs获取该选项并将其删除,但我不认为这是实现此目的的最佳方法。

有任何想法吗?

问题是您不仅在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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM