Bonjour.
J'essaie d'utiliser le module multiprocessing pour que mon application ne plante pas lorsque l'utilisateur essaie de faire un calcul trop long.
Mais en utilisant Process et Queue, je n'arrive pas à configurer les widgets Tkinter et mes variables.
print self.q.get()[0] donne bien le résultat attendu, mais quand j'essaye d'utiliser self.q.get()[index], l'application plante.

Fragment de mon code :
Code :
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
56
57
58
59
60
61
 
from multiprocessing import Process,Queue
from Tkinter import *
 
class Calculatrice:
    def calc(self):
        global entree
 
        entree=Entry(f1,width=20)
        entree.bind('<Return>',startCalc)
        entree.grid()
 
    def evaluate(self,expr):
        """Calcul dans un thread l'expression entrée"""
        c,G,R,Na,k=299792458,6.67300e-11,8.314472,6.02214e23,9e8    # Définition des constantes
 
        try:self.q.put([str(eval(expr)),''])
        except:self.q.put(['',str(exc_info()[1])])
    def startCalc(self,event=""):
        """Lance le calcul dans un thread (processus leger)"""
        global varHist, histCalculs, nCalcul,sauvegarder_hst
 
        if entree.get():    # On ne lance le calcul que si quelque chose a été entré
 
            # Ajout à l'historique des expressions entrées
            histCalculs.append(entree.get())    
            # On réinitialise le champ d'erreur et l'infobulle
            self.label_erreur.configure(text='')    
            self.ib_erreur.label.configure(text='')
            self.ib_erreur.texte=''
            # On désactive le champ de texte pour que l'utilisateur ne puisse pas lancer un calcul pendant un autre calcul
            entree.configure(state='disabled')
            self.boutonCalcul.configure(text='Stop',command=self.stopCalc)
 
            self.q=Queue()
            self.calcul=Process(target=self.evaluate,args=(entree.get(),))
            self.calcul.daemon=True
            self.calcul.start()
 
            entree.configure(state='normal')
            if self.q.get()[0]!='':      # Si aucune erreur n'est survenue pendant le calcul
                entree.delete(0,'end')
                entree.insert(0,self.q.get()[0])
                varHist+=entree.get()+' = '+self.q.get()[0]+'\n'  # Ajout à l'historique
            else:
                if not self.calcul.is_alive():self.q.put(['','Arrêt du calcul demandé'])
                varHist+=entree.get()+' = '+self.q.get()[1]+'\n'  # Ajout à l'historique
 
                self.label_erreur.configure(text=self.q.get()[1],bg='#FF5050')
                self.label_erreur.after(1000,lambda:self.label_erreur.configure(bg='#D9D9D9'))
 
                if len(self.q.get()[1])>44:
                    self.ib_erreur.label.configure(text=self.q.get()[1])
                    self.ib_erreur.texte=self.q.get()[1]
 
            nCalcul=len(histCalculs)
            if sauvegarder_hst.get()==1:Historique().update_hst()
 
            self.boutonCalcul.configure(text='Calculer',command=self.startCalc)
 
            self.calcul.join()
Pourquoi ça ne marche pas ?
Merci pour votre aide.