从事件绑定函数返回值

时间:2016-06-27 21:16:47

标签: python events tkinter

我正在尝试编写一个可以等待我按任意键然后返回鼠标位置的函数。我对如何从key(事件)函数获取xy值并使用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()

1 个答案:

答案 0 :(得分:1)

由于你正在使用内部函数并且给它们赋值,你必须告诉你的内部函数(key())你所设置的xy不是新变量,它们是外部范围内的变量。您可以使用python3中的nonlocal关键字(例如nonlocal x,y x,y = win32api.GetCursorPos())或python2中的global来执行此操作。如果你没有分配它们,你可以在内部范围内读取它们,但你不能重新分配它们。

另一种方法是可以修改非局部变量。即您可以更改非本地的可变数据类型 - 如果您将xy更改为字典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以保存新值,而不必使用具有极其常见名称xy的全局变量进行潜在的破坏性事件。

使用dict方法,您可以返回整个字典,也可以返回每个字段(即return d['x'], d['y']),以便在需要时返回好的字符。