Tkinter 滚动条不工作
Tkinter Scrollbar not working
我在 python 3.4 上有一段 tkinter 代码 运行,它是一个放置在带有垂直滚动条的 canvas 中的大框架,但是滚动条显示为灰色并且没有' 似乎与框架的大小有关。我使用的代码本质上是:
class EntryWindow:
def __init__(self, master):
self.master = master
self.master.minsize(750, 800)
self.master.maxsize(1000, 800)
self.canvas = tk.Canvas(self.master, borderwidth=0, bg='#ffffff')
self.vsb = tk.Scrollbar(self.master)
self.master_frame = tk.Frame(self.canvas)
self.vsb.pack(side="right", fill='y')
self.canvas.pack(side='left', fill='both', expand=True)
self.canvas.create_window((0,0), window=self.master_frame, anchor='nw', tags='self.master_frame')
self.canvas.config(yscrollcommand=self.vsb.set)
self.master_frame.grid()
###build widgets and place into master_frame
...
master_frame
填充了大约 36 个使用网格几何管理器放置的小部件,垂直高度达到大约 2000 像素,但滚动条不起作用。
我看到了关于使用 ttk 滚动条的 post,但是当我导入它时我无法让它工作。我使用的输入语句是:
import tkinter as tk
import tkinter.ttk as ttk
然后用 self.vsb = ttk.Scrollbar(self.master)
替换了 self.vsb = tk.Scrollbar(self.master)
行,但这也没有解决问题。我还尝试删除 master 上的 min/max 大小(这些不是最终值,我一直在玩它)。
我做错了什么吗?我觉得它可能在我设置 canvas.config() 的行中,但我阅读了文档,它似乎是正确的。明天我计划在构建框架后尝试将框架加载到 canvas。
但与此同时,如果这不起作用,任何帮助都将非常有用!谢谢!
配置滚动时必须做三件事canvas:
- 通过配置 canvas 的
yscrollcommand
属性指向滚动条,让 canvas 在滚动条滚动时通知滚动条
- 滚动条在拖动时控制canvas,通过配置滚动条的
command
属性
- 通过配置 canvas[=38= 的
scrollregion
属性,告诉 canvas 虚拟 canvas 的哪一部分应该是可滚动的]
您忽略了#3。将小部件添加到 master_frame
后,您应该这样做:
self.canvas.configure(scrollregion=self.canvas.bbox("all")
以上将告诉 canvas 和滚动条 canvas 可滚动的区域是包含 canvas 上所有对象的区域。
最后,您需要删除以下代码行,因为您已经使用 create_window
将框架添加到 canvas。使用 pack
、place
或 grid
添加到 canvas 的帧不会滚动:
# remove this line
self.master_frame.grid()
有关可滚动框架的工作示例,请参阅 Adding a scrollbar to a group of widgets in Tkinter
我在 python 3.4 上有一段 tkinter 代码 运行,它是一个放置在带有垂直滚动条的 canvas 中的大框架,但是滚动条显示为灰色并且没有' 似乎与框架的大小有关。我使用的代码本质上是:
class EntryWindow:
def __init__(self, master):
self.master = master
self.master.minsize(750, 800)
self.master.maxsize(1000, 800)
self.canvas = tk.Canvas(self.master, borderwidth=0, bg='#ffffff')
self.vsb = tk.Scrollbar(self.master)
self.master_frame = tk.Frame(self.canvas)
self.vsb.pack(side="right", fill='y')
self.canvas.pack(side='left', fill='both', expand=True)
self.canvas.create_window((0,0), window=self.master_frame, anchor='nw', tags='self.master_frame')
self.canvas.config(yscrollcommand=self.vsb.set)
self.master_frame.grid()
###build widgets and place into master_frame
...
master_frame
填充了大约 36 个使用网格几何管理器放置的小部件,垂直高度达到大约 2000 像素,但滚动条不起作用。
我看到了关于使用 ttk 滚动条的 post,但是当我导入它时我无法让它工作。我使用的输入语句是:
import tkinter as tk
import tkinter.ttk as ttk
然后用 self.vsb = ttk.Scrollbar(self.master)
替换了 self.vsb = tk.Scrollbar(self.master)
行,但这也没有解决问题。我还尝试删除 master 上的 min/max 大小(这些不是最终值,我一直在玩它)。
我做错了什么吗?我觉得它可能在我设置 canvas.config() 的行中,但我阅读了文档,它似乎是正确的。明天我计划在构建框架后尝试将框架加载到 canvas。
但与此同时,如果这不起作用,任何帮助都将非常有用!谢谢!
配置滚动时必须做三件事canvas:
- 通过配置 canvas 的
yscrollcommand
属性指向滚动条,让 canvas 在滚动条滚动时通知滚动条 - 滚动条在拖动时控制canvas,通过配置滚动条的
command
属性 - 通过配置 canvas[=38= 的
scrollregion
属性,告诉 canvas 虚拟 canvas 的哪一部分应该是可滚动的]
您忽略了#3。将小部件添加到 master_frame
后,您应该这样做:
self.canvas.configure(scrollregion=self.canvas.bbox("all")
以上将告诉 canvas 和滚动条 canvas 可滚动的区域是包含 canvas 上所有对象的区域。
最后,您需要删除以下代码行,因为您已经使用 create_window
将框架添加到 canvas。使用 pack
、place
或 grid
添加到 canvas 的帧不会滚动:
# remove this line
self.master_frame.grid()
有关可滚动框架的工作示例,请参阅 Adding a scrollbar to a group of widgets in Tkinter