tkinter Canvas 方法类似于 Text .see()

tkinter Canvas method seemilar to Text .see()

我有一个 Canvas 全是按钮,我将其 ID 存储在字典中。 canvas 很长,带有垂直滚动条。 有一种方法可以自动将视图定位在给定的按钮上吗?

当使用 Text 时,txt.see(position) 通常有效, 但我看到 Canvas 没有 see

唯一可能的替代方案似乎是 .focus(),但 cv.focus(ID) 似乎不符合我的要求

没有现成的功能可以做到这一点,但您可以使用 yview_moveto(fraction) 实现一个功能,其中 fraction 是 canvas 的最高部分,它将被关闭-屏幕。因此,yview_moveto(0) 显示 canvas 的顶部,yview_moveto(1) 显示底部。

我们需要计算分数 y/h 来显示由 iid 标识的按钮。 h 是 canvas 内容的高度,y 是按钮在 canvas 中的高度。我使用 canvas 边界框计算它们:

def show(iid):
    bbox = canvas.bbox('all')
    h = bbox[3] - bbox[1]
    y = canvas.coords(iid)[1] - bbox[1]
    canvas.yview_moveto(y/h)

下面是一个小示例,在条目中键入按钮 ID(介于 1 和 20 之间),然后单击 'Show' 移动视图以查看它。

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()