我有一个Canvas
个按钮,其ID存储在字典中。
画布非常长,带有垂直滚动条。
有一种方法可以自动将视图定位在给定的按钮上吗?
使用Text
时,txt.see(position)
通常有效,
但我看到Canvas
没有see
。
唯一可能的选择似乎是.focus()
,但cv.focus(ID)
似乎没有做我想要的事情
答案 0 :(得分:4)
没有现成的功能,但您可以使用yview_moveto(fraction)
实现一个,其中fraction
是将在屏幕外设置的画布的顶部部分。因此,yview_moveto(0)
显示画布的顶部,yview_moveto(1)
显示底部。
我们需要的是计算将显示由y/h
标识的按钮的分数iid
。 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)
以下是一个小例子,在条目中键入按钮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()