2014-02-02 2 views
2

Я переношу приложение Python Tkinter из Linux в Mac OS X Mavericks.Место события ключевого события Python Tkinter потеряно в MacOS

В части приложения у меня есть холст, и пользователь использует нажатия клавиш для выполнения действий - например, нажатие «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 не делает этого.

Спасибо - мой самый первый пост в стойке, поэтому, пожалуйста, будьте нежны!

ответ

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) 
+0

Bryan -Ваш обходной путь работает отлично. Ты спас мне много хлопот - спасибо ОЧЕНЬ много! – user3263972

Смежные вопросы