繁体   English   中英

Tkinter画布不滚动

[英]Tkinter canvas not scrolling

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的内容扩展时,滚动条应该更改,但不会。 它仍然显示为灰色且无法操作。 我究竟做错了什么?

简短的答案:您正在将滚动区域配置为一个像素一个像素。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM