2011-12-11 2 views
0

J'utilise Zelle Graphics library et je n'arrive pas à remplacer les objets graphiques (qui, dans ce cas, se trouvent être des objets texte).Problème de l'interface graphique de Zelle

Voici le code:

from Graphics import * 

winName = "Window" 
win = Window(winName,600,500) 
win.setBackground(Color('silver')) 


title = Text((300,20),"Zack's Flash Card Maker") 
title.draw(win) 

p1 = Rectangle((50, 100),(550,400)) 
p1.setFill(Color("black")) 
p1.draw(win) 




class FlashCard: 
    def __init__(self): 
     self.commands = {'addQuestion':self.addQuestion,'startGame':self.startGame} 
     self.stack = [] 
     self.questions = {} 
     self.questionAnswered = False 
     self.questionsCorrect = 0 
     self.questionsIncorrect = 0 

    def addQuestion(self): 
     question = ' '.join(self.stack) 
     self.stack = [] 
     answer = input(question) 
     self.questions[question] = answer 

    def startGame(self): 
     for question in self.questions: 
      if(self.questionAnswered == False): 
       answer=input(question) 
       questionText = Text((300,150),question) 
       questionText.setFill(Color("white")) 
       questionText.draw(win) 

       if(answer == self.questions[question]): 
        questionAnswer = Text((300,200),answer + " is correct!") 
        questionAnswer.setFill(Color("green")) 
        questionAnswer.draw(win) 

        self.questionsCorrect = self.questionsCorrect + 1 


        continue 

       else: 
        questionAnswer = Text((300,200),answer + " is incorrect. Study this one.") 
        questionAnswer.setFill(Color("red")) 
        questionAnswer.draw(win) 
        self.questionsIncorrect = self.questionsIncorrect + 1 

        continue 




    def interpret(self,expression): 
     for token in expression.split(): 
      if token in self.commands: 
       operator = self.commands[token] 
       operator() 
      else: 
       self.stack.append(token) 



i = FlashCard() 
i.interpret('What is your dog\'s name? addQuestion') 
i.interpret('What is your favorite thing to do? addQuestion') 
i.interpret('startGame') 

Ceci est essentiellement un mini-programme de carte flash que je fais. Il prend les commandes d'interprétation en bas et les exécute en fonction du dictionnaire de la classe FlashCard. Cela fonctionne essentiellement: il fait les objets de texte corrects. Cependant, le texte commence à chevaucher d'autres objets de texte, car il redessine. J'ai essayé de déplacer la fonction .draw partout, mais elle n'apparaît pas du tout ou se chevauche.

Quelqu'un a des suggestions? Je veux que le texte remplace pour chaque nouvelle question flashcard.

Merci!

Répondre

0

Il existe une commande undraw() que vous devez utiliser si vous voulez rendre invisible quelque chose. Je vous recommande de le placer juste avant vos déclarations continues. Il est utilisé comme

questionText.undraw() 
questionAnswer.undraw() 

Vous pouvez utiliser la commande del pour se débarrasser de chaque instance questionText/questionAnswer lorsque vous avez terminé avec elle. C'est probablement une meilleure option puisque vous libérez la mémoire de cette façon au lieu de stocker des données et de ne rien faire avec.

+0

Hmm. J'ai l'impression que Undraw devrait fonctionner, mais plutôt que de l'enlever avant la prochaine itération, ça ne se présente jamais au début. : \ –

+0

Comment ce programme devrait-il circuler? Mis à part les déclarations d'entrée, il n'y a nulle part où le programme s'arrête et affiche quelque chose. Et vous demandez des commentaires avant de dessiner la question à l'écran, donc je pense que c'est juste exécuter le code de draw() à undraw() trop rapidement pour remarquer à l'écran. Si vous mettez le code de dessin de question avant l'instruction input(), cela vous aide-t-il? Je vous recommande d'importer time.sleep() et d'utiliser cela pour vos sections de réponses. (c'est-à-dire, coller quelque chose comme time.sleep (2) entre votre questionAnswer.draw() et les instructions continues). –

0

Vous pouvez utiliser la méthode setText pour modifier le texte.

exemple:

string = Text(Point(1, 1), 'original string') 
sting.setText('new string') 
Questions connexes