【问题标题】:Auto scrolling through multiple widgets on canvas自动滚动画布上的多个小部件
【发布时间】:2016-09-06 20:12:36
【问题描述】:

我正在使用放置在画布上的几个小部件来显示多个任务的进度。为了做到这一点,我将它们放在框架中画布上的网格中。几乎一切正常,但我需要滚动条默认位于窗口(框架)的底部。我尝试使用 vsb.set 将滚动条强制到新位置,但没有效果。如果我使用事件处理程序来移动滚动条,我将失去对其移动的控制。我是新手,希望能提供一些意见。请参阅下面的代码。

from tkinter import *
import tkinter as tk

class example(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)
        self.initUI()

    def initUI(self):
        self.canvas = Canvas(root, borderwidth=0, background="#ffffff", height=300, width=700)
        self.frame = Frame(self.canvas, background="#ffffff")
        self.vsb = Scrollbar(root, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.vsb.set)
        self.vsb.pack(side="right", fill="y")
        self.canvas.pack(side="left", fill="both", expand=True)
        self.canvas.create_window((4,4), window=self.frame, anchor="nw", tags="self.frame")
        self.frame.bind("<Configure>", self.onFrameConfigure)
        root.title("Issue with Scrolling through Widgets")
        self.populate()     

    def onFrameConfigure(self, event):
        ###Reset the scroll region to encompass the inner frame
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))
        self.canvas.bind_all("<MouseWheel>", self._on_mousewheel)

    def _on_mousewheel(self, event):
        self.canvas.yview_scroll(-1*int(event.delta/120),"units" )

    def populate(self):
        ###Put in some fake data###
        for row in range(20):                        
            Txt = Text(self.frame, bg="white", borderwidth=1, height=1, width=40)
            Txt.grid(row = row, column = 0, rowspan = 1, columnspan = 1, sticky = W+E+N+S)
            line = "this is the first column for row %s" %row
            Txt.insert(END, str(line))
            Txt = Text(self.frame, bg="white", borderwidth=1, height=1, width=40)
            Txt.grid(row = row, column = 1, rowspan = 1, columnspan = 1, sticky = W+E+N+S)
            line = "this is the second column for row %s" %row
            Txt.insert(END, str(line))

if __name__ == "__main__":
    root=Tk()
    example(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

【问题讨论】:

  • 通过“默认到窗口底部”,你是说你想让内容滚动到底部,还是你的意思是你想让实际的滚动条处于不同的物理位置?跨度>
  • 我希望它默认显示最后发送到窗口的内容。

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


【解决方案1】:

是的,我想让滚动条在新数据放在网格上时向下移动。我找到了一个可行的解决方案,但我不确定它是否正确。我将 onFrameConfigure 函数更改为以下内容。

def onFrameConfigure(self, event):  # Reset the scroll region to encompass the inner frame
    global insertFlag
    self.canvas.configure(scrollregion=self.canvas.bbox("all"))
    self.canvas.bind_all("<MouseWheel>", self._on_mousewheel)
    if insertFlag == 1:
        self.canvas.yview_scroll(20, "units")
        insertFlag = 0

然后在填充的底部添加一个if语句来设置全局变量,如下所示。

def populate(self):
    global insertFlag
    for row in range(20):
        Txt = Text(self.frame, bg="white", borderwidth=1, height=1, width=40)
        Txt.grid(row = row, column = 0, rowspan = 1, columnspan = 1, sticky = W+E+N+S)
        line = "this is the second column for row %s" %row
        Txt.insert(END, str(line))
        Txt.see(END)
    insertFlag = 1

您的意见如何,我们非常感谢您的意见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2015-03-18
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多