tkinter: как изменить курсор на элементы холста?

Я разрабатываю небольшой графический интерфейс Python, просто для удовольствия и для обучения, и я пытался изменить форму курсора над элементами холста.

Я знаю, что можно изменить форму курсора при наведении курсора на виджет холста, используя параметр cursor="whatever" при создании холста. Но я хотел бы сделать это только для элементов внутри этого холста.

Это делает элемент правильно:

self.image_obj = canvas.create_image(
        self.column_coordinate,
        self.row_coordinate,
        image=image
    )

Это не работает:

self.image_obj = canvas.create_image(
        self.column_coordinate,
        self.row_coordinate,
        image=image,
        cursor="hand1"
    )

Опция «курсор» не существует для предметов, есть ли способ обойти проблему?


person Philippe Cotte    schedule 09.02.2019    source источник


Ответы (2)


Единственный способ изменить курсор — изменить его представление на холсте. Проверяя каждый раз, когда мышь перемещается, находится ли она внутри рамки элемента, который вы хотите изменить, вы можете добиться этого эффекта.

from tkinter import *

canvas = Canvas(width=200,height=200)
canvas.pack()

rec = canvas.create_rectangle(100,0,200,200,fill="red")#example object

def check_hand(e):#runs on mouse motion
    bbox= canvas.bbox(rec)
    if bbox[0] < e.x and bbox[2] > e.x and bbox[1] < e.y and bbox[3] > e.y:#checks whether the mouse is inside the boundrys
        canvas.config(cursor="hand1")
    else:
        canvas.config(cursor="")

canvas.bind("<Motion>",check_hand)#binding to motion
person Endover_Protocol    schedule 09.02.2019
comment
Доступные параметры курсора? - person Chris P; 25.05.2020
comment
@ChrisP Лучший результат в Google по вашему вопросу: https://www.tutorialspoint.com/python/tk_cursors.htm - person Endover_Protocol; 27.05.2020

Потратил некоторое время на выяснение этого.

Нижеприведенный метод работает для всех фигур, используя метод tag_bind() с Enter и Leave.

import tkinter as tk

main_window = tk.Tk()


def check_hand_enter():
    canvas.config(cursor="hand1")


def check_hand_leave():
    canvas.config(cursor="")


canvas = tk.Canvas(width=200, height=200)
tag_name = "polygon"

canvas.create_polygon((25, 25), (25, 100), (125, 100), (125, 25), outline='black', fill="", tag=tag_name)

canvas.tag_bind(tag_name, "<Enter>", lambda event: check_hand_enter())
canvas.tag_bind(tag_name, "<Leave>", lambda event: check_hand_leave())

canvas.pack()
main_window.mainloop()
person Saumon_fumay    schedule 03.05.2020