Python Tkinter关键事件位置在MacOS中丢失

时间:2014-02-02 22:30:10

标签: macos tkinter

我正在将Python Tkinter应用程序从Linux移植到Mac OS X Mavericks。

在应用程序的一部分中,我有一个Canvas up并且用户使用按键来执行操作 - 例如,按下'z'会使视图放大光标。这意味着我需要知道按下键时鼠标的位置。在Linux下这没问题,因为event.xevent.y正确地给出了按下键的窗口坐标,例如:

skdisp.bind('p',(lambda event : skdisp.pan(event)))

其中skdisp.pan(event)(显然)是一种平移显示的方法。

这在Linux下工作正常,但在MacOS下,关键事件不会正确地回传光标坐标 - event.xevent.y具有小的,恒定的负值。

这是一个重现此问题的小例子:

#!/usr/bin/env python
"""Put up a tiny gui and report window coordinates at which
user types a letter."""

from Tkinter import *

root = Tk()
prompt = ' Press any letter '
label1 = Label(root, text=prompt, width=len(prompt), bg='white')
label1.pack()

def key(event):
   msg = "event xy %d %d" % (event.x, event.y)
   label1.config(text=msg)  

root.bind_all('<Key>', key)
root.mainloop()

在linux系统上,当您在窗口中键入字母时,鼠标坐标会在显示屏中回显,但Mac不会这样做。

谢谢 - 我的第一篇Stack帖子,所以请保持温和!

1 个答案:

答案 0 :(得分:1)

这似乎是OSX中的一个错误。说实话,我最初有点惊讶它在linux上运行,因为光标在事件中完全不受影响。在我使用tk和tkinter进行编程的所有年份中,我从未想过要抓住按键的x / y坐标。不过,这是一个记录在案的功能,所以它应该工作。

无论如何,您可以通过使用各种winfo_*方法来获取指针的x,y坐标和窗口的x,y坐标,并进行一些数学运算。例如:

def key(event):
    px,py = event.widget.winfo_pointerxy()
    rx,ry = (event.widget.winfo_rootx(), event.widget.winfo_rooty())
    cx,cy = (px-rx, py-ry)
    msg = "event xy %d %d" % (cx, cy)
    label1.config(text=msg)