2016-11-14 11 views
3

右クリックすると、行が青色に強調表示され、そのエントリを編集または削除できるようにしようとしています。ただし、スクロールバーを追加した後、ページがスクロールされると、選択範囲はオフセットされます。スクロール可能なTkinterキャンバス上での座標の検索

私はcanvasxとcanvasyを見つけ、その後、私はそれがいつもどんな)、(1を返していないことをやるときしかしfind_closest(0を、使用しての提案のものにしようとしている。

をCanvasxとcanvasyがそれぞれにローカルに見える

ラベルではなく、キャンバス自体

from tkinter import * 

def RightClick(event): 
    #Find widgets on the row that was right clicked 
    print(canvas.canvasy(event.y)) 
    for widget in frame.winfo_children(): 
     mouseClickY = event.y_root - root.winfo_y() - widget.winfo_height() 
     widgetTopY = widget.winfo_y() 
     widgetBottomY = widget.winfo_y() + widget.winfo_height() 

     if (widget.winfo_class() == "Label") and (mouseClickY > widgetTopY) and (mouseClickY < widgetBottomY): 
      #Highlight that row 
      if widget.cget("bg") != "#338fff": 
       widget.config(bg = "#338fff", fg="#FFFFFF") 

     #Deselect all rows   
     elif widget.winfo_class() == "Label": 
      widget.config(bg = "#FFFFFF", fg="#000000") 

def onFrameConfigure(event): 
    canvas.configure(scrollregion=canvas.bbox("all")) 

root = Tk() 
root.bind("<Button-3>", RightClick) 

canvas = Canvas(root, width = 1080, height=500) 
frame = Frame(canvas) 
scrollbar = Scrollbar(root, command=canvas.yview) 
canvas.config(yscrollcommand=scrollbar.set) 

canvas.grid(row=1,column=0,columnspan=5) 
canvas.create_window((0,0), window=frame, anchor="nw",tags="frame") 
scrollbar.grid(column=5,row=1,sticky="NS") 

frame.bind("<Configure>", onFrameConfigure) 

for countY in range(40): 
    for countX in range(6): 
     l = Label(frame, text=countX, width = 25, height = 1, bg="#FFFFFF") 
     l.grid(column=countX,row=countY+1) 
+1

すっきりたくさんある、winfo_containingを使用している必要があります。 [最小限の、完全で実証可能な例を作成する方法](http://www.stackoverflow.com/help/mcve)を参照してください。 –

+0

申し訳ありませんが、修正します。ちょうど私がここに投稿するとき、私はもっとコードを投稿するように言われているので、私はしました – Mrchooch

+1

私たちは問題を再現するのに十分なコードしか必要としません。 –

答えて

1

mouseClickY = event.y_root - root.winfo_y() - widget.winfo_height() 
widgetTopY = widget.winfo_y() 
widgetBottomY = widget.winfo_y() + widget.winfo_height() 

する必要があり、それを解決判明

mouseClickY = event.y_root - root.winfo_y() 
widgetTopY = widget.winfo_rooty() 
widgetBottomY = widget.winfo_rooty() + widget.winfo_height() 

OR

私は必要ですwaaaaayより多くのコードで、プラスあなたのインデントが壊れている

関連する問題