2015-05-27 3 views
9

Ich habe ein sehr einfaches Programm, das eine einfache Handlung auf Knopfdruck anzeigt. Mein Problem ist, wenn ich das Anwendungsfenster schließe, läuft das Programm weiter, bis ich es vom Terminal töte. Unten ist mein Code und meine Untersuchung ergab, dass das Problem durchSchließen des Fensters nicht alle Prozesse

matplotlib.use('TkAgg') 

verursacht wird Aber ich weiß nicht, wie man es repariert! Wenn es hilft, laufe ich auf 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

Der obige Code ist korrekt; es muss etwas anderes geben, das den Prozess verhindert. Erstellen Sie untergeordnete Prozesse oder Daemon-Threads? –

+0

@AaronDigulla Das Problem tritt auf, wenn die Daten geplottet werden. Sonst geht es gut. Ich habe jetzt den ganzen Code mit Dummy-Daten hinzugefügt, so dass es reproduziert werden kann. – Sepehr

+0

Hängt es beim Beenden, während die Daten geplottet werden? Hängt es, nachdem das Plotten beendet ist? –

Antwort

2

Sie müssen root.quit() rufen die Tk.mainloop zu beenden(). Siehe zum Beispiel die answer here.

0

Die Lösung ist einfach. Verwenden Sie einfach

from matplotlib.figure import Figure 

statt

import matplotlib.pyplot as plt 
0

Verwendung root.mainloop außerhalb einer Funktion, die Ihre Probleme lösen sollte.