2013-06-12 26 views
0

J'ai tracé un ensemble de points et intégré le tracé dans la toile Tkinter. Ce que j'essaie de faire est de récupérer les coordonnées lorsque l'on clique sur un ou plusieurs points. J'ai été capable de le faire en utilisant le code suivant (avant de l'intégrer dans Tkinter). Cependant, cela ne fonctionne que pour la première parcelle de l'itération. Comment puis-je l'étendre pour les deux parcelles suivantes? Quelqu'un peut-il expliquer s'il vous plaît les changements doivent être faits en utilisant une toile?Récupérer les coordonnées de Tkinter Canvas

outl=[] 
index = [] 
list_rep = [] 
def on_pick(event): 
     thisline = event.artist 
     xdata, ydata = thisline.get_data() 
     tmp = [] 

     index.append(i) 
     ind = event.ind 
     tmp.append(list(xdata[ind])[0]) 
     tmp.append(list(ydata[ind])[0]) 
     outl.append(tmp) 


     #print('on pick line:', zip(xdata[ind], ydata[ind])) 

new_ydata1 = [] 
new_ydata2 = [] 
new_ydata3 = [] 
for i in range(3): 
     root = Tk.Tk() 
     root.wm_title("Embed in Tk") 

     ydata1 = np.array(Max_Correct_1[i]) 
     ydata2 = np.array(Max_Correct_2[i]) 
     ydata3 = np.array(Max_Correct_3[i]) 

     Aveg=np.array(Avg[i]) 


     f = Figure(figsize=(5,4), dpi=100) 
     ax1 = f.add_subplot(111) 

     ax1.axis([-9.5,-4.0,-10,105]) 
     ax1.plot(Log_Values_Array,ydata1,'o',picker=7) 
     ax1.plot(Log_Values_Array,ydata2,'*',picker=7) 
     ax1.plot(Log_Values_Array,ydata3,'^',picker=7) 
     ax1.plot(Log_Values_Array,Aveg,'b--') 

     canvas = FigureCanvasTkAgg(f, master=root) 

     canvas.show() 
     canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 


     canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 

     canvas.mpl_connect('pick_event',on_pick) 




     print outl 



     canvas.get_tk_widget().delete("all") 
     outl=[] 
     index = [] 
     Tk.mainloop() 
+0

J'ai été capable de collecter des coordonnées, mais j'ai un autre problème. Puisque je l'exécute en boucle, par ex. 3 parcelles, il choisit les coordonnées pour l'intrigue, mais pas pour les parcelles suivantes. Y a-t-il un clair/mise à jour manquant quelque part? Merci – user2332994

+0

utilise-t-il matplotlib? Si c'est le cas, vous pouvez ajouter une balise pour cela et/ou ajouter cette information dans la description. En outre, vous dites qu'il se plaint d'une ligne particulière, mais ne montrez pas ce que la plainte est. Pouvez-vous montrer l'erreur réelle que vous obtenez? –

+0

Salut Bryan, j'ai été capable de me débarrasser de l'erreur d'événement, mais dans le code ci-dessous, quand je parcourt les parcelles et que je choisis des points pour faire des calculs, il le fait uniquement pour l'intrigue n ° 1. Pour les graphiques 2 et 3, l'événement pick_event ne semble pas fonctionner. – user2332994

Répondre

1

Je crois que cela a quelque chose à voir avec le fait que vous essayez de créer plus d'une instance de Tk en utilisant une boucle, et en essayant d'appeler mainloop sur chacun d'eux. Il ne devrait y avoir qu'un seul Tk pour une application donnée, et donc n'appeler que mainloop sur cette seule instance.

Créez cette racine Tk instance avant vous arrivez à la boucle for. Une fois à l'intérieur de la boucle, utilisez le widget TopLevel pour créer chaque fenêtre de tracé en tant qu'enfant de cette racine. Une fois la boucle terminée, appelez mainloop à la racine.

Voici un très les grandes lignes de code approximatif qui devrait fonctionner:

Sans accès à vos données (et les autres modules que vous utilisez), il sera difficile de confirmer que cela fonctionne pour ce dont vous avez besoin, mais devrait faire l'affaire. Pour travailler encore plus efficacement, vous pouvez envisager de créer une classe pour chaque fenêtre de tracé (sous-classe TopLevel), puis d'utiliser la boucle pour créer trois instances, en transmettant les données appropriées à chaque instance. De cette façon, la fenêtre et les opérations de chaque intrigue peuvent être isolées.

Questions connexes