2010-05-13 8 views
1

J'essaie d'apprendre Tkinter dans le but de pouvoir créer une portée en temps réel pour tracer des données. Comme un test, j'essaye de dessiner un polygone sur la toile chaque fois que le bouton 'draw' est pressé. La position du triangle est randomisée. J'ai deux problèmes:Ajouter dynamiquement des éléments à Tkinter Canvas

  1. Il ya un triangle sur la toile dès que le programme démarre, pourquoi et comment résoudre ce problème?

  2. Il ne dessine pas de triangles lorsque j'appuie sur le bouton, au moins aucun que je puisse voir.

CODE


from Tkinter import * 

from random import randint 

class App: 

    def __init__(self,master): 

     #frame = Frame(master) 
     #frame.pack(side = LEFT) 

     self.plotspc = Canvas(master,height = 100, width = 200, bg = "white") 
     self.plotspc.grid(row=0,column = 2, rowspan = 5) 

     self.button = Button(master, text = "Quit", fg = "red", \ 
          command = master.quit) 
     self.button.grid(row=0,column=0) 

     self.drawbutton = Button(master, text = "Draw", command = \ 
           self.pt([50,50])) 
     self.drawbutton.grid(row = 0, column = 1)   

    def pt(self, coords): 
     coords[0] = coords[0] + randint(-20,20) 
     coords[1] = coords[1] + randint(-20,20) 
     x = (0,5,10) 
     y = (0,10,0) 
     xp = [coords[0] + xv for xv in x] 
     yp = [coords[1] + yv for yv in y] 
     ptf = zip(xp,yp) 
     self.plotspc.create_polygon(*ptf)   

    if __name__ == "__main__": 
     root = Tk() 
     app = App(root) 
     root.mainloop() 

Répondre

5

command=self.pt([50,50]) (que vous utilisez dans l'appel Button qui construit le bouton Draw) exécute immédiatement l'appel que vous dites à exécuter, et lie le résultat (None) à command. Utiliser, au contraire, dans ce même:

, command=lambda: self.pt([50, 50])) 

pour retarder l'exécution de l'appel à chaque fois que ce bouton est enfoncé.

Questions connexes