我试图通过在画布上绘制光标来模拟光标,并根据运动事件移动它。在
根据文档“除了Enter和Leave”,不按按钮就不会发生鼠标移动事件。然而,Tkinter接受绑定到事件,这似乎是我想要的,除了一件事:您必须首先单击根窗口中的某个地方,才能启动。{{1>如果没有重入一次,窗口将永远不会丢失。在
这种行为与我的目标不符(也令人费解,为什么会有人想要呢?)所以我编写了一个小程序,看看是否可以更改它,也许可以使用event_generate。我还不能,但在这个过程中,我发现Tkinter对鼠标事件的处理有点模糊。首先,它经常会漏掉和{}(你把指针移出去,它仍然认为它在里面,反之亦然)。更令人惊讶的是:有时,当您将指针移入时,它会触发和一两个{}事件,而不单击根窗口。然后它就安静了:在您单击之前,不会再有事件。您可以用下面的代码重现这些问题。我在运行OS X El Capitan,Python2.7。在
任何关于这些行为的解释,或者关于如何在不点击的情况下跟踪运动事件的想法都将受到赞赏。在from Tkinter import *
def enter(e):
if e.widget is not canvas:
print " caught by", e.widget
if canvas.state != "outside":
print " in 'inside' state!"
canvas.state = "inside"
canvas.n = 0
canvas.itemconfig(inout, text=canvas.state)
canvas.itemconfig(count, text="no motions yet")
canvas.event_generate('', x=e.x, y=e.y, state=0x0100)
#canvas.update()
def motion(e):
if canvas.state == "outside":
print " in 'outside' state!"
canvas.n += 1
canvas.itemconfig(count, text="motions since enter: {:03d}".format(canvas.n))
#canvas.update()
def leave(e):
if e.widget is not canvas:
print "Leave caught by", e.widget
if canvas.state == "outside":
print " in 'outside' state!"
canvas.state = "outside"
canvas.itemconfig(inout, text=canvas.state)
canvas.itemconfig(count, text="")
#canvas.update()
root = Tk()
frame = Frame(root)
frame.pack(fill=BOTH)
canvas = Canvas(frame, bg='#E4E4E4', highlightthickness=0)
canvas.grid(row=0, column=0, sticky=W+E+N+S)
canvas.create_text(140, 20, text="(tracking , , )")
inout = canvas.create_text(140, 100, text="outside")
count = canvas.create_text(140, 120, text="")
canvas.n = 0
canvas.state = "outside"
canvas.bind('', enter)
canvas.bind('', motion)
canvas.bind('', leave)
canvas2 = Canvas(frame, height=100, highlightthickness=0)
canvas2.grid(row=1, column=0, sticky=W+E)
canvas2.create_text(140, 50, text="(no tracking here)")
frame.rowconfigure(0, weight=1)
def focusout(e):
print "root lost focus"
root.bind('', focusout)
root.mainloop()