tkinter将滚动条放在画布底部位置

时间:2017-01-23 10:33:03

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

关于我的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滚动条放在底部,还是应该将画布视图放在底部。

问题2.您能否就如何使用moveto提供一些指导,还是应该采用不同的方法?

非常感谢!

  

2 个答案:

答案 0 :(得分:1)

画布的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)

root.mainloop()

顺便说一句,我认为将y滚动条放到底部或将画布视图放到底部之间没有任何区别,因为两者是相互关联的。但我猜想你想知道是否使用滚动条或画布的方法来做,我给出了上面的答案。

答案 1 :(得分:0)

我发现在移动滚动选项卡之前必须使用idle_tasks:

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