Bonjour,
je préfère prévenir : je suis débutant en python. Toutefois j'ai une expérience de longue date en C et en C++. Du coup forcément j'essaie de reproduire les mécanismes dont j'ai l'habitude. Aussi : je m'excuse par avance si ma question est stupide.
Voici un bout de code simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
import matplotlib.pyplot as plt
import numpy as np
import Tkinter as tk
import matplotlib.figure as mplfig
import matplotlib.backends.backend_tkagg as tkagg
pi = np.pi
 
 
class App(object):
    def __init__(self, master):
        self.master = master
        self.fig = mplfig.Figure(figsize=(3, 3))  
        self.ax = self.fig.add_axes([0.125, 0.125, 0.75, 0.75], polar=True)  
        self.canvas = tkagg.FigureCanvasTkAgg(self.fig, master=master)  
        self.ax.grid(True)
        self.gridIsOn = True;
#
         N = 5
        theta = np.arange(0.0, 2 * pi, 2 * pi / N)
        radii = np.arange(10.0,50, 40 / N) #[5.0,10.0,20.0,30.0,40.0 ]
        width = [2 * pi / (N)] * 5
        bars = (
            # self.ax.bar(0, 20, width=2 * pi, linewidth=0) +
            self.ax.bar(theta, radii, width))#, bottom=0.2))
        cmap = plt.get_cmap('jet')
         for r, bar in zip(radii, bars):
            bar.set_facecolor(cmap(r / 50.))
            bar.set_alpha(0.5)
         self.ax.set_xticklabels([])
        self.ax.set_yticklabels([])
         self.canvas.get_tk_widget().pack()
        self.canvas.draw()
        ### UN MORCEAU DU PROBLEMEE
        self.b = tk.Button(master, text="OK", command=App.ButtonCall(self))
        self.b.pack()
    @staticmethod
    def ButtonCall(o):  ## ICI ON EST EN PLEIN DANS LE PROBLEME
        print ("click!");
     #   if o.gridIsOn==True:
     #       o.gridIsOn=False;
     #   else:
     #        o.gridIsOn=True;
      #  o.ax.grid(o.gridIsOn)
      #  o.canvas.draw()
 
 
 
def main():
    root = tk.Tk()
    app = App(root)
    tk.mainloop()
 
if __name__ == '__main__':
    main()


Il s'agit juste d'un code qui embarque une figure Matplotlib dans un environnement Tk. J'ai un soucis avec le callback. J'ai besoin que le callback connaisse l'objet App. Aussi je passe "un pointeur" sur l'objet App, et "self" me parait une bonne idée pour çà (c'est ce que je fais à la ligne 35)
Une fois que j'atteins le callback, tant que les lignes commentées sont commentées ca marche, j'ai bien des "click" qui s'affichent dans la console. Mais si j'accède à l'objet o (par exemple en décommentant les lignes sous le print, ligne 40 et suivantes), alors le callback affiche une fois "click" et ensuite l'application est bloquée.

Qu'est-ce qui est incorrect ?

D'avance merci ...