Question

J'essaie de faire un devoir pour implémenter Simon Says en python.J'essaie de le faire en utilisant la bibliothèque Turtle (une exigence).

Cependant, je me suis heurté à une pierre d'achoppement dans la mesure où, même si je peux faire en sorte que l'écran enregistre les événements de clic (actuellement, j'imprime simplement les coordonnées x, y), je n'arrive pas à le faire attendre un événement de clic.

Plus précisément, ce que je prévois de faire, c'est d'avoir des zones sur l'écran qui, lorsqu'ils cliquent à cet endroit, sont considérées comme s'ils avaient cliqué sur un bouton.L'écran s'efface et le jeu fait quoi que ce soit.

Cependant, dans les expériences visant à obtenir un « bouton » fonctionnel, tout ce qu'il fait est de le configurer de manière à imprimer les coordonnées x, y mais le reste du programme se termine.Je n'ai pas attendu que l'utilisateur clique sur quoi que ce soit.J'ai essayé une méthode de blocage de...

while clicked == False:
    pass

ou

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

mais les deux méthodes bloquent le programme jusqu'à ce que je l'interrompe manuellement, puis il imprimera les clics.

Est-ce que j'ai raté une option quelque part ?

Était-ce utile?

La solution 2

Ainsi, après une recherche approfondie, il n'est pas nécessairement possible d'exécuter le code en Python lors de l'utilisation de la tortue pour attendre un événement de clic.Peut-être que dans tk je pourrais faire ça mais pas dans la tortue.

Cependant, il existe un moyen de contourner cela.Par exemple.Une méthode définit le bouton faux de l'écran, définit l'événement Click et se termine.L'événement de clic lorsque cliqué sur Appelle la méthode suivante requise pour l'exécution.Donc, jusqu'à ce que le bouton soit cliqué sur le code réel ne fait rien, mais reste en mémoire d'utilisation.

si plus spécifiquement. 1. Créez un 'bouton'. 2. Demandez à votre programme de se comporter normalement jusqu'à ce qu'il devait attendre un événement de clic. 3. Configurez l'écran à l'écran sur (ou sur la tortue) de manière à ce que le "bouton" soit cliqué sur la partie suivante du code.

Note spéciale.Le code en question ne peut pas dépendre de l'attente d'un événement de clic pour plus tard en code.Au lieu de cela, le clic provoque la partie suivante de l'exécution de votre code.

Autres conseils

Les tortues n'ont pas de boutons, mais elles ont des rappels pour les clics.De plus, vous devez utiliser onclick pour Screen pour détecter les clics généraux et onclick pour turtle pour détecter les clics chez les tortues.Vous pouvez par exemple réaliser 4 GRANDES tortues de couleurs différentes en utilisant une forme dynamique.

De plus, la tortue est basée sur Tk, vous devez donc être conscient de choses comme mainloop()

Le programme suivant donne quelques astuces pour 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()

Vous pouvez rendre la fonction enregistrée avec OnClick () Testez la position X, Y.Si c'est dans une région, vous faites ce que vous devez.

Je ne vois pas la différence entre ce que vous voulez faire et que ce code fait, la modification de la position de la tortue n'est qu'un exemple, vous pouvez faire n'importe quoi lorsqu'un clic est capturé par Onclick (), même démarrer un filSi vous en avez vraiment besoin (en utilisant Création de threads dans 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()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top