2017-10-16 9 views
0

J'ai un problème avec le débordement de la pile python. J'écris une application avec python en utilisant Tkinter et 4 autres threads. mais le problème est que, après une heure de travail, je reçois l'erreur de débordement de la pile et l'application se bloque. mes questions:Dépassement de pile Python avec tkinter et threading

  1. La méthode "après" de Tkinter peut-elle affecter le système et causer un problème de débordement de pile? Je dois l'utiliser toutes les 0,5 secondes pour mettre à jour mon interface graphique.
  2. Les variables (il y a beaucoup de variables) peuvent-elles affecter la mémoire de la pile? Ai-je besoin de les supprimer (del)?
  3. Y at-il un moyen de savoir spécialement quel fil et quelle fonction ont fait le débordement? parce que j'ai une fonction récursive dans l'un des threads.

Merci!

class App(): 
def __init__(self, master): 
    self.master = master 
    notebook=ttk.Notebook(master,width=800,height=480) 
    frame1=ttk.Frame(notebook,style='TNotebook') 
    frame2=ttk.Frame(notebook,style='TNotebook') 
    frame3=ttk.Frame(notebook,style='TNotebook') 
    frame4=ttk.Frame(notebook,style='TNotebook') 
    notebook.add(frame1,text='p1') 
    notebook.add(frame2,text='p2') 
    notebook.add(frame3,text='p3') 
    notebook.add(frame4,text='p4') 
    notebook.pack() 

    self.varopt34=StringVar(master) 
    self.varopt34.set(datashowgui[27].strip()) 
    self.opt34=OptionMenu(frame3,self.varopt34,'0','1') 
    self.opt34.config(background="gray80",font="Harabara",width=1,height=1,highlightbackground="white",activebackground="gray80",fg="white") 
    self.opt34.place(x=370,y=220) 

    varopt1=StringVar(master) 
    varopt1.set(fglines[5]) 
    opt1=OptionMenu(frame4,varopt1,id1,id2,id3,id4,id5,command=self.forganize1) 
    opt1.place(x=150,y=18) 
    opt1.config(background="gray80",font="Harabara",width=11,height=2,highlightbackground="white",activebackground="gray80",fg="white") 

    tkButtonSave=tk.Button(frame3,image=clockimage16,text="Save Settings and Reboot",compound=CENTER,command=self.savesettings,bg="white",highlightbackground="white",activebackground="white",fg="white",font=("Harabara",15),width=250,height=20) 
    tkButtonSave.place(x=500,y=320) 

    tkButtonReset=tk.Button(frame4,image=clockimage16,text="Reset Sensors and Reboot",compound=CENTER,command=self.resetsensors,bg="white",highlightbackground="white",activebackground="white",fg="white",font=("Harabara",15),width=250,height=20) 
    tkButtonReset.place(x=500,y=320) 

    tkButtonQuit=tk.Button(master,image=clockimage16,text="Quit",compound=CENTER,command=self.quitwindow,bg="white",highlightbackground="white",activebackground="white",fg="white",font=("Harabara",20),width=100,height=20) 
    tkButtonQuit.place(x=600,y=420) 

    self.update_reading() 


def savesettings(self): 
    f=open("tempconfigreference.txt","r") 
    datasaveref=f.readlines() 
    f.close() 
    f=open("tempconfig.txt","w+") 
    f.writelines(datasaveref) 
    f.close()  


def quitwindow(self):  
    self.master.destroy() 

def resetsensors(self): 
    f=open("temps.txt","r") 
    lines=f.readlines() 
    f.close() 
    f=open("organizedtemps.txt","w+") 
    f.writelines(lines) 
    f.close() 


def savesensors(self): 
    #print('savesensorsisrunning') 
    organizetemp.dosave()  
    #&self.after(100 , savesensors)  


def update_reading(self): 
    now=datetime.now() 
    nowpersian=jalali.Gregorian(now.year,now.month,now.day).persian_tuple() 
    self.master.after(580 , self.update_reading) 
    self.master.after(850 , self.savesensors) 
def display(threadName): 

#print (threadName) 
root = Tk() 
app = App(root) 
root.mainloop() 

oui bien sûr, ceci est un exemple de code et un résumé de l'un des threads qui contrôle l'interface graphique. Voici le fil qui ont la fonction récursive (il est coupé pour être facile à lire):

def startcommunicate(thread_name): 
def cpu_temp(): 
    htot1=open("finaltemps.txt","r") 
    linesorganized=htot1.readlines() 
    htot1.close() 
    if linesorganized: 
     cpu_temp=linesorganized[0] 
    else: 
     cpu_temp=0 
    return cpu_temp 
try: 
    run (host='169.254.176.82', port=80, quiet=True) 
except: 
    time.sleep(5) 
    startcommunicate('Thread-1')   
+0

Comment l'utilisez-vous après? Il ne devrait pas y avoir de problème avec la méthode after si vous mettez simplement à jour une étiquette ou un champ de saisie. Nous aurions besoin de voir un exemple testable de votre code pour prouver une bonne réponse. Veuillez lire et fournir [exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve) –

+0

pouvez-vous afficher le message d'erreur réel? –

+0

oui bien sûr, "erreur python fatale ne peut pas récupérer de stackoverflow". Je travaille sur un appareil embarqué et je me demande pourquoi je ne reçois pas d'erreur de récurrence alors que je ne l'ai pas mis à une limite haute !? – user3271199

Répondre

0

Je trouve le problème. C'était la fonction récursivement appelée "startcommunicate". Mais je devrais trouver un meilleur moyen d'écrire le fil mentionné (Peut-être en utilisant une boucle while). Prêt à recevoir de l'aide! Merci.