【问题标题】:tkinter put scrollbar on canvas at bottom positiontkinter 将滚动条放在画布的底部位置
【发布时间】:2017-06-07 20:04:24
【问题描述】:

关于我的 tkinter 画布上滚动条位置的问题。我有一个带有 3 个画布小部件的框架。礼貌to this post 的想法。我添加了一个水平滚动条,每个画布都有一个 50+ 列 500+ 行的 pandas 数据框。加载不是很快,但这不是目标。

新行将添加到每个数据框的底部。这个新行需要验证。因此,与其每次都向下滚动,不如滚动条/或画布显示底部。

请参见下面定义 3x 画布和 3x 滚动条 (x+y) 的代码。

def createBox(window):
    list_ = ['df1', 'df2', 'df3'] # 3 dataframes

    for i in range(3):
            mybox = LabelFrame(window, padx=5, pady=4)
            mybox.grid(row=i, column=0)
            createWindow(mybox, list_[i], i)

def createWindow(box, lt_actual, i):
    canvas = Canvas(box, borderwidth=0)
    frame = Frame(canvas)
            vsbY = Scrollbar(box, orient="vertical", command=canvas.yview)
            canvas.configure(yscrollcommand=vsbY.set, width=1200, heigh=200) 
            vsbY.pack(side="right", fill="y")

            vsbX = Scrollbar(box, orient="horizontal", command=canvas.xview)
            canvas.configure(xscrollcommand=vsbX.set, width=1200, heigh=200)       
            vsbX.pack(side="bottom", fill="x")

    #canvas.yview_moveto(1) - no effect
    #canvas.yview_moveto(1.0) - no effect

    canvas.pack(side="left", fill="both", expand=True)
    canvas.create_window((4,4), window=frame, anchor="nw", tags="frame")

    # be sure that we call OnFrameConfigure on the right canvas
    frame.bind("<Configure>", lambda event, canvas=canvas: OnFrameConfigure(canvas))

我在这个论坛和一些info (effbot) pages 上读到我应该使用 moveto() / yview_moveto() 命令选项,但到目前为止这似乎不起作用。

问题 1. 我应该将 y-scrollbar 放在底部还是应该将画布视图放在底部。

问题 2。您能否就如何使用 moveto 提供一些指导,或者我应该采用不同的方法吗?

非常感谢!

【问题讨论】:

    标签: python pandas tkinter tkinter-canvas tkinter.scrollbar


    【解决方案1】:

    canvas 的yview_moveto 方法确实是正确使用的函数。它的参数是你想要离开屏幕的画布总高度的分数。因此,使用 0 作为参数显示画布的顶部,使用 1 显示底部。

    参考


    import tkinter as tk
    
    root = tk.Tk()
    
    canvas = tk.Canvas(root)
    canvas.grid(row=0, column=0)
    canvas.create_oval(0, 0, 20, 20, fill='red')
    canvas.create_oval(0, 800, 20, 820, fill='blue')
    
    ys = tk.Scrollbar(root, orient='vertical', command=canvas.yview)
    ys.grid(row=0, column=1, sticky='ns')
    # configure scrolling
    canvas.configure(yscrollcommand=ys.set, scrollregion=canvas.bbox('all'))
    # show bottom of canvas
    canvas.yview_moveto('1.0')
    
    root.mainloop()
    

    顺便说一句,我看不出将 y 滚动条放在底部或将画布视图放在底部之间有什么区别,因为两者是相互关联的。但是我猜你想知道是使用滚动条的方法还是画布的方法,我在上面给出了答案。

    【讨论】:

    • @l_4321 谢谢。这确实是一个有效的例子。稍后将检查我的代码有什么问题。但我会就我的错误提供反馈。谢谢。
    【解决方案2】:

    我发现在移动滚动标签之前需要使用idle_tasks:

        self.canvas.update_idletasks()
        self.canvas.yview_moveto(0)
    

    【讨论】:

    • 我的滚动条几乎移动到最后,但由于某种原因没有完全向下。但这解决了它。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2019-07-24
    • 2011-12-05
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多