【问题标题】:Tkinter canvas not scrollingTkinter 画布不滚动
【发布时间】:2015-12-18 06:17:24
【问题描述】:

Tkinter 专家,我无法让 Canvas 滚动。这是我的第二个 GUI,我之前做过类似的事情,所以我不知道我做错了什么。如果您能提供任何帮助,我将不胜感激。

这是我正在尝试做的最小版本。我在 Windows 10 上使用 python 3.4.3。

import tkinter as tk
import tkinter.font as tk_font
import tkinter.ttk as ttk
import random


def get_string_var(parent, value=''):
    var = tk.StringVar(parent)
    var.set(value)
    return var


class SummaryFrame(ttk.Frame):
    def __init__(self, parent, **kwargs):
        ttk.Frame.__init__(self, parent, **kwargs)

        var_names = ['label_'+str(num) for num in range(1, 20)]
        self.vars = {}
        for name in var_names:
            self.vars[name] = get_string_var(self)

        self._add_summary_labels(self, self.vars, 1)

    @staticmethod
    def _add_summary_labels(frame, vars, start_row):
        current_row = start_row
        for name in vars:
            tk.Label(frame, text=name, anchor=tk.N+tk.W).grid(row=current_row, column=0, sticky=tk.N+tk.S+tk.W+tk.E)
            text_label = tk.Label(frame, wraplength=200, textvariable=vars[name], anchor=tk.N+tk.W, justify=tk.LEFT)
            text_label.grid(row=current_row, column=1, sticky=tk.W)
            current_row += 1

    def set_summary_fields(self, info):
        for name in info:
            if name in self.vars:
                self.vars[name].set(info[name])


class OuterFrame(ttk.Frame):
    def __init__(self, parent, **kwargs):
        ttk.Frame.__init__(self, parent, **kwargs)

        self.canvas = tk.Canvas(self)
        scrollbar = ttk.Scrollbar(self, orient=tk.VERTICAL, command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=scrollbar.set)
        self.summary = SummaryFrame(self.canvas)
        self.summary.pack(fill=tk.BOTH, expand=1)
        self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
        scrollbar.pack(side=tk.LEFT, fill=tk.Y, expand=1)

        label_text = {}
        for i in range(1, 20):
            label_text['label_'+str(i)] = "information " * random.randint(1, 20)
        self.set_fields(label_text)

    def set_fields(self, info):
        self.summary.set_summary_fields(info)
        self.canvas.configure(scrollregion=(1, 1, self.summary.winfo_width(), self.summary.winfo_height()))


if __name__ == "__main__":
    root = tk.Tk()
    frame = OuterFrame(root)
    frame.pack(fill=tk.BOTH, expand=1)
    root.mainloop()

当内部 SummaryFrame 的内容展开时,滚动条应该会改变,但不会。它仍然灰显且无法操作。我做错了什么?

【问题讨论】:

    标签: python tkinter scrollbar ttk


    【解决方案1】:

    简答:您将滚动区域配置为一个像素一个像素。

    您正在根据self.summary 的宽度和高度配置scrollregion,但您在窗口有机会映射到屏幕之前执行此操作。因此,宽度和高度是一回事。

    在计算窗口的宽度和高度之前,您需要等待窗口被绘制出来。

    【讨论】:

    • 谢谢。你的回答让我指出了正确的方向。我忘记调用 self.canvas.create_window,所以摘要框架从未映射到画布上。在此和绑定到画布上的“”之间,它现在可以工作了。
    猜你喜欢
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多