我正在将Python Tkinter应用程序从Linux移植到Mac OS X Mavericks。
在应用程序的一部分中,我有一个Canvas up并且用户使用按键来执行操作 - 例如,按下'z'会使视图放大光标。这意味着我需要知道按下键时鼠标的位置。在Linux下这没问题,因为event.x
和event.y
正确地给出了按下键的窗口坐标,例如:
skdisp.bind('p',(lambda event : skdisp.pan(event)))
其中skdisp.pan(event)
(显然)是一种平移显示的方法。
这在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()
在linux系统上,当您在窗口中键入字母时,鼠标坐标会在显示屏中回显,但Mac不会这样做。
谢谢 - 我的第一篇Stack帖子,所以请保持温和!
答案 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)