python - Tkinter 滚动条不工作

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

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

import tkinter as tk
import tkinter.ttk as ttk

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

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

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

最佳答案

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

  1. 通过配置 Canvas 的 yscrollcommand 属性指向滚动条,让 Canvas 在滚动时通知滚动条
  2. 通过配置滚动条的command属性,让滚动条在拖动时控制 Canvas
  3. 通过配置 Canvas 的 scrollregion 属性告诉 Canvas 虚拟 Canvas 的哪一部分应该是可滚动的

您忽略了#3。将小部件添加到 master_frame 后,您应该这样做:

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

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

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

# remove this line
self.master_frame.grid()

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

关于python - Tkinter 滚动条不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38780724/

相关文章:

Python curses - 无法获取 TAB 键

python - 在 matplotlib 图中对两点之间的区域进行着色

python - 使用 Beautifulsoup4 从 HTML 中去除 Doctype?

python - 如何在 tkinter python gui 中找到鼠标点击附近的标签

python - 如何配置 python cffi 库以使用 mingw?

python - raw_input 中的字母和数字计数

python - 不需要列表理解乘法

python - centos 7 上的 Python 3.6 中缺少 turtle 图形模块?

python-3.x - 为什么 tkinter 输入验证需要调用 register()?

python - 为什么我必须双击才能更改按钮对象的浮雕效果? (tkinter)