在可滚动的 Tkinter 上查找坐标 canvas

Finding coordinates on a scrollable Tkinter canvas

我正在努力做到这一点,当您右键单击时,该行会突出显示为蓝色,然后您可以编辑或删除该条目。但是,由于添加了滚动条,如果页面滚动,则选择将被偏移。

我曾尝试建议找到 canvasx 和 canvasy 然后使用 find_closest(0,但是当我这样做时它总是 returns (1,)不管怎样。

Canvasx 和 canvasy 似乎是每个标签的本地标签,而不是 canvas 本身

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)

解决了,原来

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()

我应该用winfo_containing,这样更整洁