2017-05-16 5 views
1

나는 Canvas의 버튼으로 구성되어 있으며, ID는 사전에 저장되어 있습니다. 캔버스가 매우 길고 세로 스크롤 막대가 있습니다. 주어진 단추에보기를 자동으로 배치하는 방법이 있습니까? tkinter 캔버스 메서드는 텍스트와 비슷합니다 .see()

Text를 사용

, txt.see(position)는 일반적으로 작동 하지만 Canvassee이 없습니다 참조하십시오.

가능한 유일한 대안은 .focus() 것 같다,하지만 cv.focus(ID) 나던 내가 그렇게 할 준비가 만든 기능이 없습니다

답변

3

하고 싶은 일을하는 것,하지만 당신은 fraction 상단 부분은 yview_moveto(fraction)를 사용하여 하나를 구현할 수 있습니다 화면 밖으로 설정 될 캔버스의 따라서 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()