【问题标题】:tkinter: How to change cursor over canvas items?tkinter:如何在画布项目上更改光标?
【发布时间】:2019-02-09 10:40:20
【问题描述】:

我正在开发一个小的 python gui,只是为了好玩和学习,我一直在尝试改变画布项目上的光标形状。

我知道在画布创建时使用 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"
    )

项目的“光标”选项似乎不存在,有没有办法解决这个问题?

【问题讨论】:

    标签: python canvas tkinter items


    【解决方案1】:

    改变光标的唯一方法是改变它在画布上的呈现方式。每次移动时检查鼠标是否在要切换的item的边界框内就可以达到这个效果。

    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
    

    【讨论】:

    【解决方案2】:

    花了一些时间解决这个问题。

    以下方法适用于所有形状,使用带有 Enter 和 Leave 的 tag_bind() 方法。

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

    【讨论】:

    • 我认为这两个答案之间更好。 标记比其他答案更具可读性,并且计算成本可能更低(尽管两者在任何现实生活中的表现都差不多)。
    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2021-07-19
    • 2017-05-13
    • 2015-10-08
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多