2017-06-14 132 views
1

我试着用帆布创建红色cirlce或黄色标签,上面有“X”来改变鼠标的提示。Tkinter的部件跟随鼠标移动

我使用了一个“哪里”功能来捕捉鼠标移动,并为我提供鼠标尖的当前位置,因此将上述任一提示放置在mounse尖端位置即红色圆圈或黄色标签。

我意识到,如果他们是在鼠标右尖放置,也不是那么理想,因为它可以屏蔽底层的窗口小部件,但是让我们把那一边。

使用下面的代码,你会认识到所选择的前端从实际的鼠标端部位置偏移,而我居然把那么就在一角。那么为什么是抵消?哪里不对?

我也意识到,定位装置放置widget的西北角。

这个示例程序可以让你选择尖端一起玩,通过点击其他尖,交换到它。

所以,你可以看到,通过选择笔尖形状,该行为是相同的。

import tkinter as tk 

def changetip(a):   # change cursor tip, arg a is not used 
    global tipType 
    if tipType=="red" : tipType="yellow" 
    else: tipType="red" 

def where(posn):      #cursor tiop movement and colour change 
    cx=posn.x_root-w.winfo_x() 
    cy=posn.y_root-w.winfo_y() 
    if tipType=="red": 
     tipC.place(x=cx, y=cy) 
     tipL.place(x=300,y=300) 
    else: 
     tipC.place(x=400, y=400) 
     tipL.place(x=cx,y=cy) 

w=tk.Tk() 
w.geometry("500x500+100+100") 
w.bind("<Motion>",where)  #track mouse movement 

tipType="red"   # red is the canvas circle, yellow is label 

# Make a cursor tip using a circle on canvas 
tip_rad=10 
tipC=tk.Canvas(w,width=tip_rad*2,height=tip_rad*2,highlightthickness=0,bg="green") 
tip=tk.Canvas.create_oval(tipC,tip_rad/2,tip_rad/2,tip_rad/2*3,tip_rad/2*3, width=0, fill="red") 
tipC.bind("<1>",changetip) 

# Make a cursor tip using a label 
tip_size=1 
tipL=tk.Label(w,width=tip_size, height=tip_size,text="x",bg="yellow") 
tipL.bind("<1>",changetip) 

w.mainloop() 

回答

2

你应该忽略的事件对象(posn),并只与相对于主部件w像素位置工作。更改where的前两行如下:

def where(posn): 
    cx=w.winfo_pointerx() - w.winfo_rootx() 
    cy=w.winfo_pointery() - w.winfo_rooty() 
+0

很好。效果很好。 – ffrree