自定义Tkinter小部件(ScrollFrame)放置

时间:2016-05-11 13:26:18

标签: python python-3.x tkinter tkinter-canvas

我在这里创建了一个自定义可滚动框架,完整代码:

from tkinter import Frame, Canvas, Scrollbar


class ScrollFrame(Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.canvas = Canvas(self)
        self.interior = Frame(self.canvas)
        self.vscroll = Scrollbar(
            self, orient='vertical', command=self.canvas.yview
        )

        self.canvas.configure(yscrollcommand=self.vscroll.set)
        self.vscroll.config(command=self.canvas.yview)

        def config_canvas(ev):
            self.canvas.configure(
                scrollregion=self.canvas.bbox('all'), width=200, height=200
            )

        self.vscroll.pack(fill='y', side='right', expand=0)
        self.canvas.pack(side='left', fill='both', expand=1)
        # self.interior.pack(side='left', fill='both', expand=1)  # tried with and without this line, no change
        self.interior.bind('<Configure>', config_canvas)

        self.interior_id = self.canvas.create_window(
            0, 0, window=self.interior, anchor='nw',
        )

据我所知,在不使用太多魔法的情况下,我必须使用子框架来放置小部件。在我的Widget中,它是self.interior。

如果我在其上放置一个小部件,那么一切看起来都很好,例如:

label_on_scrollframe = Label(scrollframe_instance.interior)
label_on_scrollframe.grid(row=0, column=0)

但如果我添加此行,则新小部件会显示在滚动条的右侧:

label2on_scrollframe = Label(scrollframe_instance.interior)
laber2on_scrollframe.grid(row=0, column=1)

问题是,为什么要这样做以及如何解决它?

2 个答案:

答案 0 :(得分:1)

唯一可能的解释是这些其他小部件不是作为内部小部件的子节点创建的。

答案 1 :(得分:0)

它不起作用的原因真的令人尴尬。我在生产代码中留下了一些代码,重新定义了我想要放置的标签,而没有将内部设置为其父级。

这个问题现在已经解决了,感谢每个花时间的人。