tkinter Canvas方法似乎是Text .see()

时间:2017-05-16 08:19:18

标签: python tkinter tkinter-canvas

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

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

唯一可能的选择似乎是.focus(),但cv.focus(ID)似乎没有做我想要的事情

1 个答案:

答案 0 :(得分:4)

没有现成的功能,但您可以使用yview_moveto(fraction)实现一个,其中fraction是将在屏幕外设置的画布的顶部部分。因此,yview_moveto(0)显示画布的顶部,yview_moveto(1)显示底部。

我们需要的是计算将显示由y/h标识的按钮的分数iidh是画布内容的高度,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)

以下是一个小例子,在条目中键入按钮ID(1到20之间),然后单击“显示”以移动视图以查看它。

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