我正在尝试用 python 来实现 Simon Says 的家庭作业。我正在尝试使用海龟库来做到这一点(一个要求)。

然而,我遇到了一个绊脚石,虽然我可以让屏幕注册点击事件(当前只是打印 x,y 坐标),但我无法让它等待点击事件。

具体来说,我计划做的是在屏幕上设置一些区域,当他们在该位置内单击时,会被视为单击了按钮。屏幕清零,游戏开始执行任何操作。

然而,在尝试获得一个工作“按钮”的实验中,它所做的只是设置它,以便打印 x,y 坐标,但程序的其余部分完成。没有等待用户点击任何内容。我尝试了一种阻止方法...

while clicked == False:
    pass

或者

while clicked == False:
    time.sleep(1)

但这两种方法都会挂起程序,直到我手动中断,然后它才会打印点击次数。

我是否在某个地方缺少一个选项?

有帮助吗?

解决方案 2

因此,在大量搜索之后,不一定是在使用Turtle等待某些点击事件时暂停Python中的代码的方法。也许在TK中我可以这样做,但不是在乌龟。

但是,有一种方法可以绕过这一点。举个例子。方法在屏幕上设置虚假按钮,设置单击事件并终止。单击时,单击“事件”在“执行”所需的下一个方法时。因此,直到单击按钮,实际代码就不做任何事情,但仍然存在于内存中。

更具体地说。 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()
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top