TKinter:可滚动 Canvas、可扩展小部件和打包
TKinter: Scrollable Canvas, Expandable Widgets, and Pack
我正在创建一个 table 使用在框架内布置为网格的标签。我想将此框架嵌入到可滚动的 canvas 中,并且我希望标签在保持垂直滚动功能的同时展开以填充水平 space。要查看我正在尝试做什么,这是我的代码:
class ScrollableTable(Frame):
def __init__(self, parent, rows=4, columns=5):
self.rows = rows
self.columns = columns
Frame.__init__(self, parent, borderwidth=0, background='green')
self.canvas = Canvas(self, borderwidth=0)
self.frame = Frame(self.canvas, borderwidth=0, background='black')
self.vsb = Scrollbar(parent, orient=VERTICAL, command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.canvas.pack(side=LEFT, fill=X, expand=TRUE)
# This is where I fix the height I want this window to take up
self.canvas.configure(yscrollcommand=self.vsb.set, width=720, height=80)
self.height = self.canvas.winfo_reqheight()
self.width = self.canvas.winfo_reqwidth()
self._widgets = []
for row in range(rows):
current_row = []
for column in range(columns):
label = Label(self.frame, text="N/A",
borderwidth=0, width=5, anchor=W, justify=LEFT)
label.grid(row=row, column=column, sticky='NESW', padx=0.5, pady=0.5)
current_row.append(label)
self._widgets.append(current_row)
self.canvas.create_window((0,0), window=self.frame, anchor='w', tags=self.frame)
self.frame.bind("<Configure>", self.OnFrameConfigure)
self.canvas.bind("<Configure>", self.onResize)
#self.frame.pack(side=LEFT, fill=X, expand=True)
self.vsb.pack(side=RIGHT, fill=Y, expand=True)
在上面的代码中,倒数第二行被注释掉了。当它被注释掉时,我得到一个 table,它不会展开以填充 space,但滚动条有效。但是,如果我取消注释该行并使用 frame.pack 方法,table 会填充水平 space,但我会失去滚动功能。我无法理解为什么我无法滚动 - 有任何指示吗?
您需要而不是在框架上调用pack
,因此您需要手动管理框架的宽度。通常,您通过绑定到 canvas 上的 <Configure>
事件来执行此操作。在绑定函数中,获取canvas的宽度,然后使用itemconfigure
方法设置window对象的宽度。
我正在创建一个 table 使用在框架内布置为网格的标签。我想将此框架嵌入到可滚动的 canvas 中,并且我希望标签在保持垂直滚动功能的同时展开以填充水平 space。要查看我正在尝试做什么,这是我的代码:
class ScrollableTable(Frame):
def __init__(self, parent, rows=4, columns=5):
self.rows = rows
self.columns = columns
Frame.__init__(self, parent, borderwidth=0, background='green')
self.canvas = Canvas(self, borderwidth=0)
self.frame = Frame(self.canvas, borderwidth=0, background='black')
self.vsb = Scrollbar(parent, orient=VERTICAL, command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.canvas.pack(side=LEFT, fill=X, expand=TRUE)
# This is where I fix the height I want this window to take up
self.canvas.configure(yscrollcommand=self.vsb.set, width=720, height=80)
self.height = self.canvas.winfo_reqheight()
self.width = self.canvas.winfo_reqwidth()
self._widgets = []
for row in range(rows):
current_row = []
for column in range(columns):
label = Label(self.frame, text="N/A",
borderwidth=0, width=5, anchor=W, justify=LEFT)
label.grid(row=row, column=column, sticky='NESW', padx=0.5, pady=0.5)
current_row.append(label)
self._widgets.append(current_row)
self.canvas.create_window((0,0), window=self.frame, anchor='w', tags=self.frame)
self.frame.bind("<Configure>", self.OnFrameConfigure)
self.canvas.bind("<Configure>", self.onResize)
#self.frame.pack(side=LEFT, fill=X, expand=True)
self.vsb.pack(side=RIGHT, fill=Y, expand=True)
在上面的代码中,倒数第二行被注释掉了。当它被注释掉时,我得到一个 table,它不会展开以填充 space,但滚动条有效。但是,如果我取消注释该行并使用 frame.pack 方法,table 会填充水平 space,但我会失去滚动功能。我无法理解为什么我无法滚动 - 有任何指示吗?
您需要而不是在框架上调用pack
,因此您需要手动管理框架的宽度。通常,您通过绑定到 canvas 上的 <Configure>
事件来执行此操作。在绑定函数中,获取canvas的宽度,然后使用itemconfigure
方法设置window对象的宽度。