tkinter 将滚动条放在 canvas 底部位置
tkinter put scrollbar on canvas at bottom position
关于我的 tkinter 上滚动条位置的问题 canvas。我有一个包含 3 canvas 个小部件的框架。感谢 to this post 提出的想法。我添加了一个水平滚动条,每个 canvas 都有一个 50+ 列 500+ 行 pandas 数据框。负载不是很快,但这不是 objective.
新行将添加到每个数据框的底部。这个新行需要验证。因此,与其每次都向下滚动,不如滚动条 / 或 canvas 显示底部。
请参阅下面定义了 3x canvas 和 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 应该放在底部还是 canvas view 应该放在底部
问题 2。您能否提供一些有关如何使用 moveto 的指导,或者我应该采用不同的方法吗?
非常感谢!
canvas的yview_moveto
方法确实是正确使用的函数。它的参数是你想要off-screen的canvas总高度的分数。所以使用 0 作为参数显示 canvas 的顶部和 1,底部。
参考:
- Tkinter.Canvas.yview_moveto-method
将 canvas 调整为给定的滚动偏移量。
偏移 '0.0'
是 scrollregion 的开始,'1.0'
是结束。
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-scrollbar 放在底部或将 canvas 视图放在底部之间有什么区别,因为两者是链接的。但是我猜你想知道是用滚动条的方法还是canvas的方法来做,我在上面给出了答案。
我发现有必要在移动滚动标签之前使用idle_tasks:
self.canvas.update_idletasks()
self.canvas.yview_moveto(0)
关于我的 tkinter 上滚动条位置的问题 canvas。我有一个包含 3 canvas 个小部件的框架。感谢 to this post 提出的想法。我添加了一个水平滚动条,每个 canvas 都有一个 50+ 列 500+ 行 pandas 数据框。负载不是很快,但这不是 objective.
新行将添加到每个数据框的底部。这个新行需要验证。因此,与其每次都向下滚动,不如滚动条 / 或 canvas 显示底部。
请参阅下面定义了 3x canvas 和 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 应该放在底部还是 canvas view 应该放在底部
问题 2。您能否提供一些有关如何使用 moveto 的指导,或者我应该采用不同的方法吗?
非常感谢!
canvas的yview_moveto
方法确实是正确使用的函数。它的参数是你想要off-screen的canvas总高度的分数。所以使用 0 作为参数显示 canvas 的顶部和 1,底部。
参考:
- Tkinter.Canvas.yview_moveto-method
将 canvas 调整为给定的滚动偏移量。
偏移'0.0'
是 scrollregion 的开始,'1.0'
是结束。
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-scrollbar 放在底部或将 canvas 视图放在底部之间有什么区别,因为两者是链接的。但是我猜你想知道是用滚动条的方法还是canvas的方法来做,我在上面给出了答案。
我发现有必要在移动滚动标签之前使用idle_tasks:
self.canvas.update_idletasks()
self.canvas.yview_moveto(0)