やりたいように見えるが、あなたはfraction
がトップ端数があるyview_moveto(fraction)
を使用して、1を実装することができます画面外に設定されるキャンバスのしたがって、yview_moveto(0)
はキャンバスの上部を表示し、yview_moveto(1)
は下部を表示します。
で示されるボタンを表示する小数部y/h
を計算する必要があります。 h
はキャンバスのコンテンツの高さで、y
はキャンバス内のボタンの高さです。私は、キャンバスのバウンディングボックスを使用して計算:
def show(iid):
bbox = canvas.bbox('all')
h = bbox[3] - bbox[1]
y = canvas.coords(iid)[1] - bbox[1]
canvas.yview_moveto(y/h)
そして以下は、小さな例で、エントリに(1〜20)ボタンのIDを入力し、それを見るためにビューをシフトする「表示」をクリックします。
import tkinter as tk
def show(iid):
bbox = canvas.bbox('all')
h = bbox[3] - bbox[1]
y = canvas.coords(iid)[1] - bbox[1]
canvas.yview_moveto(y/h)
root = tk.Tk()
canvas = tk.Canvas(root, bg='white')
canvas.pack(fill='both', expand=True)
e = tk.Entry(root)
e.pack()
tk.Button(root, text='Show', command=lambda: show(e.get())).pack()
buttons = {}
for i in range(1, 21):
b = tk.Button(canvas, text='Button %i' % i)
iid = canvas.create_window(0, 30*i, anchor='nw', width=70, height=30, window=b)
buttons[iid] = b
canvas.configure(scrollregion=canvas.bbox('all'))
root.mainloop()