2015-05-27 13 views
9

Ho un programma molto semplice che visualizza un semplice grafico alla pressione di un pulsante. Il mio problema è quando chiudo la finestra dell'applicazione, il programma continua a funzionare finché non lo uccido dal terminale. Di seguito è riportato il mio codice e la mia indagine ha mostrato che il problema è causato daChiudere la finestra non uccide tutti i processi

matplotlib.use('TkAgg') 

Ma non so come risolverlo! Se aiuta, sto funzionando su OSX.

#!/usr/bin/python 

from Tkinter import * 
import matplotlib 
matplotlib.use('TkAgg') 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
import matplotlib.pyplot as plt 
# ------ End of imports 

class Ops: 
    def show_plot(self): 
     self.f, self.figarray = plt.subplots(1, sharex=True, sharey=True) 
     self.figarray.plot((1,2,3),(1,2,3)) 
     plt.tight_layout() 
     self.canvas = FigureCanvasTkAgg(self.f, master=self.mainFrame) 
     self.canvas._tkcanvas.config(background='white', borderwidth=0, highlightthickness=0) 
     self.canvas._tkcanvas.pack(side=TOP, fill=BOTH) 


class GUI(Ops): 
    def __init__(self, master): 
     self.master = master 
     self.width = self.master.winfo_screenwidth() # Width of the screen 
     self.height = self.master.winfo_screenheight() # Height of the screen 
     self.x = (self.width/2) 
     self.y = (self.height/2) 
     self.master.geometry("%dx%d+%d+%d" % (self.width, self.height, self.x, self.y)) 
     self.mainFrame = Frame(self.master) # Generate the main container 
     self.mainFrame.pack() 

     # ---------- TOP FRAME ---------- 
     self.topFrame = Frame(self.mainFrame) 
     self.topFrame.pack() 

     self.browse_button = Button(self.topFrame, text="Plot", command=self.show_plot) 
     self.browse_button.grid() 


class App: 
    def __init__(self): 
     self.file_handler = Ops() 
     self.root = Tk() 
     self.gui_handler = GUI(self.root) 

    def run(self): 
     self.root.mainloop() 

Application = App() 
Application.run() 
+0

Il codice sopra riportato è corretto; deve esserci qualcos'altro che impedisce l'arresto del processo. Crei processi figlio o thread daemon? –

+0

@AaronDigulla Il problema sorge quando i dati vengono tracciati. Altrimenti esce bene. Ora ho aggiunto l'intero codice con dati fittizi in modo che possa essere riprodotto. – Sepehr

+0

Si blocca quando si esce mentre i dati sono tracciati? Si blocca dopo che la trama è finita? –

risposta

2

è necessario chiamare root.quit() per porre fine alla Tk.mainloop(). Ad esempio, vedere answer here.

0

La soluzione è semplice. Basta usare

from matplotlib.figure import Figure 

invece di

import matplotlib.pyplot as plt 
0

Uso root.mainloop al di fuori di una funzione, che dovrebbe risolvere i vostri problemi.

Problemi correlati