Pergunta

Eu estou tentando, por um dever de casa para implementar Simon Diz em python.Eu estou tentando fazê-lo usando a tartaruga biblioteca (uma exigência).

No entanto, eu tenho que correr em uma pedra de tropeço no que enquanto eu posso obter o ecrã para registar eventos de clique (actualmente a imprimir apenas as coordenadas x,y) eu não posso fazê-lo esperar por um evento de clique.

Especificamente o que eu estou pensando em fazer é ter áreas na tela que quando clicar no prazo que o local é considerado como se tivesse clicado em um botão.Tela limpa e o jogo faz o que quer.

No entanto, em experimentos na tentativa de obter um trabalho 'botão' tudo o que ela faz é defini-lo de modo imprime as coordenadas x,y, mas o resto do programa terminar.Não esperar que o usuário clique em nada.Eu tentei um método de bloqueio de...

while clicked == False:
    pass

ou

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

mas ambos os métodos trava o programa até que eu interromper manualmente e, em seguida, ele vai imprimir o número de cliques.

Eu estou faltando uma opção em algum lugar?

Foi útil?

Solução 2

Então, depois de extensa pesquisa, não há, necessariamente, uma forma de parar a execução do código em python enquanto usando tartaruga para esperar por algum evento de clique.Talvez em Tk eu poderia fazer isso, mas não em tartaruga.

No entanto, há uma forma de contornar isso.Como um exemplo.Um método define o falso botão na tela, define o evento de clique, e termina.O evento de clique quando clicado chama o seguinte método, necessário para a execução.Então, até que o botão for clicado, o código atual não está fazendo nada, mas permanece na memória para uso.

Assim, mais especificamente.1.Criar um 'botão'.2.Ter seu programa de comportar-se normalmente, até que ele precisa esperar por um evento de clique.3.Configurar a tela do mouse (ou tartaruga), de tal forma que quando o 'botão' é clicado, a próxima parte do código é executado.

Nota especial.O código em questão não podem depender de espera para um evento de clique para mais tarde no código.Em vez disso, o rato faz com que a próxima parte da execução do seu código.

Outras dicas

Tartarugas não tem botões, mas eles têm retornos de chamada para os cliques.Além disso, você deve usar onclick para Screen para detectar geral cliques e onclick para turtle para detectar clicando nas tartarugas.Você pode, por exemplo, fazer um 4 GRANDES tartarugas com cores diferentes usando uma forma dinâmica.

Além disso, a tartaruga é baseada em Tk, então você deve estar ciente das coisas como mainloop()

O programa a seguir damos algumas dicas para 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()

Você pode fazer a função registada com onclick() teste a posição x,y.Se estiver dentro de alguma região que você faça o que você deve.

Eu não vejo a diferença entre o que você quer fazer e o que este código faz, a modificação da tartaruga posição é apenas um exemplo, você pode fazer qualquer coisa quando um rato é capturado por onclick(), até mesmo iniciar uma thread se você realmente precisa dele (usando o A criação de Threads em 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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top