使用Turtle,我希望能够创建一个包含用户单击的屏幕位置的变量。
我发现可以使用以下代码来打印点击的位置:
import turtle
def find_click_pos(x, y):
print('{0}, {1}'.format(x, y))
def main():
turtle.onscreenclick(find_click_pos)
main()
turtle.mainloop()
此问题是x, y
坐标仅在find_click_pos
函数中定义,据我所知,不使用全局变量就无法在函数的其他位置使用它们(我想不惜一切代价避免)。
有什么方法可以将.onscreenclick()
的值发送给函数吗? turtle
是否还有其他功能可以满足我想要的功能?
答案 0 :(得分:2)
您传递给onscreenclick
的回调函数可以使用其调用的x
和y
值来完成所需的操作。尚不清楚您要做什么,但是很难想象您找不到在函数中执行此操作的方法。
如果您担心如何在不使用全局变量的情况下传递值,则最好的方法可能是使回调成为类中的方法,以便它可以分配其他方法可以轻松读取的属性:
import turtle
class Foo:
def __init__(self):
self.click_x = 0 # initialize with dummy values
self.click_y = 0
turtle.ontimer(self.other_method, 1000)
def click_cb(self, x, y):
self.click_x = x
self.click_y = y
def other_method(self):
print(self.click_x, self.click_y)
turtle.ontimer(self.other_method, 1000)
foo = Foo()
turtle.onscreenclick(foo.click_cb)
turtle.mainloop()
答案 1 :(得分:0)
这似乎是错误的做法。我喜欢@Blckknght的基于对象的解决方案(+1),但是您只需将包含对象实例的全局变量替换为包含位置的全局变量。 >
如果您确实想做错事,并且避免使用全局变量,那么您也可能会以错误的方式进行操作-而且,比危险的默认值更错误的是:
import turtle
def get_click_position(x=None, y=None, stash=[0, 0]): # dangerous default value
if x != None != y:
stash[0:] = (x, y)
return turtle.Vec2D(*stash)
def print_click_position():
x, y = get_click_position()
print('{0}, {1}'.format(x, y))
turtle.ontimer(print_click_position, 1000)
turtle.onscreenclick(get_click_position)
print_click_position()
turtle.mainloop()
如果您想知道最后一次点击是什么,请不带任何参数调用get_click_position()
。它将一直返回该结果,直到出现新的单击为止,这时将调用get_click_position()
作为带有参数的事件处理程序。