Python 使用海龟按钮
-
21-12-2019 - |
题
我正在尝试用 python 来实现 Simon Says 的家庭作业。我正在尝试使用海龟库来做到这一点(一个要求)。
然而,我遇到了一个绊脚石,虽然我可以让屏幕注册点击事件(当前只是打印 x,y 坐标),但我无法让它等待点击事件。
具体来说,我计划做的是在屏幕上设置一些区域,当他们在该位置内单击时,会被视为单击了按钮。屏幕清零,游戏开始执行任何操作。
然而,在尝试获得一个工作“按钮”的实验中,它所做的只是设置它,以便打印 x,y 坐标,但程序的其余部分完成。没有等待用户点击任何内容。我尝试了一种阻止方法...
while clicked == False:
pass
或者
while clicked == False:
time.sleep(1)
但这两种方法都会挂起程序,直到我手动中断,然后它才会打印点击次数。
我是否在某个地方缺少一个选项?
解决方案 2
但是,有一种方法可以绕过这一点。举个例子。方法在屏幕上设置虚假按钮,设置单击事件并终止。单击时,单击“事件”在“执行”所需的下一个方法时。因此,直到单击按钮,实际代码就不做任何事情,但仍然存在于内存中。
更具体地说。 1.创建一个“按钮”。 2.您的程序是否正常行为,直到它需要等待单击事件。 3.在单击“按钮”时,在“按钮”在“按钮”的方式运行“按钮”时,请在屏幕上单击(或在海龟上)。
特别注意。有问题的代码不能依赖于等待代码稍后的单击事件。相反,单击“导致执行代码的下一部分。
其他提示
海龟没有按钮,但它们有点击回调。此外,您应该使用 onclick
为了 Screen
检测一般点击和 onclick
为了 turtle
检测海龟的点击。例如,您可以使用动态形状制作 4 只不同颜色的大乌龟。
另外,turtle 是基于 Tk 的,因此您必须注意以下事项: mainloop()
以下程序给出了 Python 2.7.5 的一些提示。
import turtle as t
from random import randint
class MyTurtle(t.Turtle) :
def __init__(self,**args) :
t.Turtle.__init__(self,**args)
def mygoto(self,x,y) :
t1.goto(x,y)
print x,y
def randonics(self,x,y) :
self.left(randint(90,270))
def minegoto(x,y) :
print x,y
t1.goto(x,y)
wt=t.Screen()
t1=MyTurtle()
wt.register_shape("big",((0,0),(30,0),(30,30),(0,30)))
t1.shape("big")
wt.onclick(t1.mygoto,btn=1)
wt.onclick(minegoto,btn=2)
t1.onclick(t1.randonics,btn=3)
t1.goto(100,100)
t.mainloop()
您可以使onclick()在onclick()中注册的函数测试x,y位置。如果它在某个地区内,你就必须做任何事情。
我没有看到你想做什么和这个代码的差异,龟头的修改只是一个例子,你可以在onclick()捕获单击时做任何事情,甚至开始一个线程如果您真的需要它(使用在python )中创建线程
import turtle as t
from random import randint
from threading import Thread
from time import sleep
def threaded_function(arg,t1):
for i in range(arg):
print "running",i
sleep(1)
t1.forward(i*10)
def minegoto(x,y) :
print x,y
t1.goto(x,y)
thread = Thread(target = threaded_function, args = (10,t1 ))
thread.start()
thread.join()
print "thread finished...exiting"
wt=t.Screen()
t1=t.Turtle()
wt.register_shape("big",((0,0),(30,0),(30,30),(0,30)))
t1.shape("big")
wt.onclick(minegoto,btn=1)
t1.goto(100,100)
t.mainloop()
.