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

MacOS中丢失的Python Tkinter关键事件位置,macos,tkinter,Macos,Tkinter,我正在将一个Python Tkinter应用程序从Linux移植到MacOSX Mavericks 在应用程序的一部分,我有一个画布,用户使用按键来做一些事情——例如,按下“z”键会使视图放大光标。这意味着我需要知道按下键时鼠标在哪里。在Linux下,这没有问题,因为event.x和event.y正确地给出了按键所在的窗口坐标,例如: skdisp.bind('p',(lambda事件:skdisp.pan(事件))) 其中skdisp.pan(事件)显然是一种平移显示的方法 这在Linux下可

我正在将一个Python Tkinter应用程序从Linux移植到MacOSX Mavericks

在应用程序的一部分,我有一个画布,用户使用按键来做一些事情——例如,按下“z”键会使视图放大光标。这意味着我需要知道按下键时鼠标在哪里。在Linux下,这没有问题,因为
event.x
event.y
正确地给出了按键所在的窗口坐标,例如:

skdisp.bind('p',(lambda事件:skdisp.pan(事件)))

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

这在Linux下可以正常工作,但在MacOS下,按键事件无法正确返回光标坐标--
event.x
event.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()
#/usr/bin/env python
“”“安装一个小型gui并报告窗口坐标
用户键入一个字母。”“”
从Tkinter进口*
root=Tk()
prompt='按任意字母'
label1=Label(根,text=prompt,width=len(prompt),bg='white')
标签1.pack()
def键(事件):
msg=“事件xy%d%d”%(事件x、事件y)
label1.config(text=msg)
root.bind_all(“”,键)
root.mainloop()
在linux系统中,当您在窗口中键入字母时,鼠标坐标会在显示器中回响,但Mac不会这样做


谢谢-我的第一个堆栈后,所以请温柔

这似乎是OSX中的一个bug。老实说,一开始我有点惊讶它能在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)  

布莱恩-你的变通方法非常有效。你给我省了很多麻烦——非常感谢!