Tkinter滚动条不起作用

时间:2016-08-05 03:41:54

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

我在python 3.4上运行了一段tkinter代码,这是一个放置在带有垂直滚动条的画布中的大框架,但滚动条是灰色的,似乎没有链接到框架的大小。我正在使用的代码基本上是:

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滚动条的帖子,但是当我导入它时我无法使用它。我使用的输入语句是:

import tkinter as tk
import tkinter.ttk as ttk

然后将self.vsb = tk.Scrollbar(self.master)替换为self.vsb = ttk.Scrollbar(self.master),但这也没有解决。我也尝试删除master上的min / max大小(这些不是最终值,我一直在玩它)。

我有什么问题吗?我觉得它可能在我设置canvas.config()的行,但我阅读文档,它似乎是正确的。明天我计划在构建框架后尝试将框架加载到画布中。

但与此同时,如果不起作用,任何帮助都会很棒!谢谢!

1 个答案:

答案 0 :(得分:2)

配置滚动画布时必须做三件事:

  1. 让画布在滚动时通知滚动条,方法是将画布的yscrollcommand属性配置为指向滚动条
  2. 通过配置滚动条的command属性,让滚动条在拖动时控制画布
  3. 通过配置画布的scrollregion属性告诉画布虚拟画布的哪些部分应该可滚动
  4. 你忽略了做#3。将小部件添加到master_frame后,您应该这样做:

    self.canvas.configure(scrollregion=self.canvas.bbox("all")
    

    上面将告诉画布和滚动条,可滚动画布的区域是包含画布上所有对象的区域。

    最后,您需要删除以下代码行,因为您已经使用create_window将框架添加到画布。添加到包含packplacegrid的画布的框架将不会滚动:

    # remove this line
    self.master_frame.grid()
    

    有关可滚动框架的工作示例,请参阅Adding a scrollbar to a group of widgets in Tkinter