2016-06-27 3 views
0

Я пытаюсь написать функцию, которая может ждать, когда я нажму любую клавишу, а затем верну свою позицию мыши. Я смущен тем, как получить значение xy из функции key (event) и вернуть их с помощью get_mouse_pixel().возвращаемое значение из функции, связанной с событием

from Tkinter import * 
import win32api 

def get_mouse_pixel(): 
    x,y = 0,0 

    root = Tk() 

    def key(event): 
     x,y = win32api.GetCursorPos() 
     print "pressed", repr(event.char) 
     print "mouse position", x, y 
     root.quit() 

    def callback(event): 
     print "clicked at", event.x, event.y 

    frame = Frame(root, width=0, height=0) 
    frame.bind("<Key>", key) 
    frame.bind("<Button-1>", callback) 
    frame.pack() 
    frame.focus_set() 

    root.mainloop() 

print x,y 
return x,y 

get_mouse_pixel() 
+0

Вы получаете x и y в key(), но никогда не называете это. И нецелесообразно определять функции внутри функций. – Psytho

+0

@ Alex.S Почему это не хорошая практика для определения функций внутри функций? – thebjorn

ответ

1

Поскольку вы используете внутренние функции и вы даете им значение, вы должны сказать своей внутренней функции (key()), что x и y вы устанавливаете не являются новым переменными, они те, во внешнем масштабе. Вы можете сделать это с помощью ключевого слова nonlocal в python3 (например, nonlocal x,yx,y = win32api.GetCursorPos()) или global в python2. Если вы не назначили им, вы можете прочитать их во внутренней области, но вы не можете повторно назначить их.

Другой способ сделать это - то, что вы может изменить нелокальные переменные. То есть вы можете изменить изменяемые типы данных, которые не являются локальными, - если вы меняете x и y в словарь d = {'x':0, 'y':0}, ваш key() может изменить это нелокальное;

# Define x/y as dictionary d higher 
def key(event): 
    d['x'],d['y'] = win32api.GetCursorPos() 
    # Everything else you would like to do with x/y. 

Это изменит словарь d провести новые значения без необходимости делать потенциально разрушительные вещи с глобальными переменными с очень общими именами x и y.

С помощью метода dict вы можете либо вернуть весь словарь, либо вы можете возвратить каждую часть (то есть return d['x'], d['y']), чтобы вернуть красивые ints, если хотите.

+0

Спасибо! Я пробовал ключевое слово global, и он работает. Будет ли эта глобальная декларация влиять на что-либо еще, если я буду многократно вызывать функцию get_mouse_pixel() в другой программе? – Siyu

+0

@Siyu Если какая-либо переменная в вашей другой программе называется 'x' или' y', она может столкнуться и вызвать странные ошибки, которые могут быть трудно отследить. Я настоятельно рекомендую использовать метод словаря, поскольку он позволяет использовать более привязанную инкапсуляцию (или заменять на python 3, поэтому вы можете использовать «нелокальный», поскольку он ограничен лучше). – Delioth

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