2016-11-14 7 views
3

Ich versuche es so zu machen, dass wenn Sie mit der rechten Maustaste klicken, die Zeile blau markiert ist und Sie diesen Eintrag bearbeiten oder löschen können. Seit dem Hinzufügen einer Bildlaufleiste wird die Auswahl jedoch verschoben, wenn die Seite gescrollt wird.Koordinaten auf einem scrollbaren Tkinter Canvas finden

Ich habe vorgeschlagen, was versucht, den canvasx und canvasy zu finden und dann find_closest mit (0, aber wenn ich das tun es gibt immer (1,), egal was.

Canvasx und canvasy zu jeder lokale scheinen Etikett, nicht die Leinwand selbst

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

viel ist, dass waaaaay mehr Code ist, die notwendig ist, plus Ihre Einbuchtung ist gebrochen. Bitte lesen Sie [So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel] (http://www.stackoverflow.com/help/mcve) –

+0

Entschuldigung, ich werde das beheben. Gerade wenn ich hier poste, wurde mir gesagt, dass ich mehr Code posten sollte, also tat ich – Mrchooch

+1

. Wir brauchen nur genug Code, um das Problem zu reproduzieren, nichts mehr. –

Antwort

1

es wurde gelöst, verwandelt sich

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

out sein sollte

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

ODER

Ich sollte winfo_containing verwendet haben, die sauberere

Verwandte Themen