2017-06-14 108 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