我正在尝试编写一个可以等待我按任意键然后返回鼠标位置的函数。我对如何从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()
答案 0 :(得分:1)
由于你正在使用内部函数并且给它们赋值,你必须告诉你的内部函数(key()
)你所设置的x
和y
不是新变量,它们是外部范围内的变量。您可以使用python3中的nonlocal
关键字(例如nonlocal x,y
x,y = win32api.GetCursorPos()
)或python2中的global
来执行此操作。如果你没有分配它们,你可以在内部范围内读取它们,但你不能重新分配它们。
另一种方法是可以修改非局部变量。即您可以更改非本地的可变数据类型 - 如果您将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']
),以便在需要时返回好的字符。