自定义 Tkinter 小部件 (ScrollFrame) 放置
Custom Tkinter Widget (ScrollFrame) placement
我创建了一个自定义的可滚动框架,完整代码在这里:
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',
)
据我所知,在不使用太多魔法的情况下,我必须使用一个子框架来放置小部件。在我的小部件中它是 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)
问题是,为什么会这样,如何解决?
唯一可能的解释是这些其他小部件不是作为内部小部件的子项创建的。
没有成功的原因真是尴尬。我在生产代码中留下了一些代码,这些代码重新定义了我想要放置的标签,而不是将 interior 作为其父级。
这个问题已经解决了,感谢大家抽空
我创建了一个自定义的可滚动框架,完整代码在这里:
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',
)
据我所知,在不使用太多魔法的情况下,我必须使用一个子框架来放置小部件。在我的小部件中它是 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)
问题是,为什么会这样,如何解决?
唯一可能的解释是这些其他小部件不是作为内部小部件的子项创建的。
没有成功的原因真是尴尬。我在生产代码中留下了一些代码,这些代码重新定义了我想要放置的标签,而不是将 interior 作为其父级。
这个问题已经解决了,感谢大家抽空