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()
我有一个 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()