python - Tkinter 滚动框架:扩展框架以适应一个方向的内容画布
问题描述
我正在尝试制作一个具有设定高度的框架和一个响应鼠标滚动事件的垂直滚动条。框架需要包含框架,所以没有我可以使用的内置 Tk 小部件。这是我正在使用的 Python 3 代码,来自这里的几个相关答案:
import tkinter as tk
class VertScrollingFrame(tk.Frame):
def __init__(self, root):
super().__init__(root)
self.canvas = tk.Canvas(root)
self.frame = tk.Frame(self.canvas)
self.bar = tk.Scrollbar(root, orient = "vertical", command = self.canvas.yview)
self.bar.lift(self.frame)
self.canvas.configure(yscrollcommand = self.bar.set)
self.bar.pack(side = "right", fill = "y")
self.canvas.pack(side = "left", fill = 'both', expand = True)
self.canvas.create_window(
(4, 4),
window = self.frame,
anchor = "nw",
tags = "self.frame",
)
#self.frame.pack()
def on_cfg(_):
self.canvas.configure(scrollregion = self.canvas.bbox("all"))
self.frame.bind('<Configure>', on_cfg)
def on_scroll(event):
if event.delta:
amount = round(-event.delta / 120)
else:
amount = {4: -1, 5: 1}[event.num] * 2
self.canvas.yview_scroll(amount, "units")
bind_keys = {'<MouseWheel>', '<Button-4>', '<Button-5>'}
def scroll_bind(_):
for key in bind_keys:
self.canvas.bind_all(key, on_scroll)
def scroll_unbind(_):
for key in bind_keys:
self.canvas.unbind_all(key)
self.frame.bind('<Enter>', scroll_bind)
self.frame.bind('<Leave>', scroll_unbind)
root = tk.Tk()
win = tk.Toplevel(root)
sf = VertScrollingFrame(win)
for _ in range(20):
f = tk.Frame(sf.frame)
for x in range(12):
tk.Button(f, text = str(x)).pack(side = 'left')
f.pack()
sf.pack()
root.mainloop()
我已经用宽广的按钮网格填充了滚动框架,并且画布似乎正在水平调整大小以适应它们,但事实ScrollingFrame
并非如此。它只是切断了内容的右侧。如何使框架扩展以水平适应其内容?
通过调用self.frame.pack()
uncommented,我得到了一个不同的错误结果:按钮网格在垂直和水平方向上都被奇怪地裁剪了,并且没有什么可以滚动的。
解决方案
推荐阅读
- python - 使用 Pandas 检查 Python 中的日期列表是否完整
- eloquent - 缺少的数据属于许多关系
- go - Prometheus 警报管理器模板更改
- java - 我的 ObjectOutputStream 工作不正常
- axios - 在我的代码中没有收到错误响应 http 代码
- javascript - 发布-订阅模式与 UI 的可见性
- python - 如何绘制通过使用牛顿法评估函数而呈现的多个数据点
- c++ - 如何解决声明错误
- python - 在 Python 中用科学计数法绘制值的表?
- powershell - 如何在powershell中导入csv替换字符并导出保存在blob中的csv