2017-05-16 3 views
1

私はCanvasのボタンがいっぱいで、そのIDは辞書に保存されています。 キャンバスは非常に長く、垂直スクロールバーがあります。 特定のボタンにビューを自動的に配置する方法はありますか? tkinterキャンバスメソッドは、テキストと同じように.see()

Textを使用して

txt.see(position)は通常、作品 が、私は Canvasは何 seeを持っていない参照してください。

唯一可能な選択肢は、.focus()をするようだが、cv.focus(ID) doesntのは、私はそれを行うには準備ができて機能がありません

答えて

3

やりたいように見えるが、あなたはfractionがトップ端数があるyview_moveto(fraction)を使用して、1を実装することができます画面外に設定されるキャンバスのしたがって、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() 
関連する問題