2015-05-27 19 views
9

Mam bardzo prosty program, który wyświetla prosty wykres po naciśnięciu przycisku. Mój problem polega na tym, że zamykam okno aplikacji, program działa, dopóki nie zabiję go z terminala. Poniżej znajduje się mój kod, a moje dochodzenie wykazało, że problem jest spowodowany przez:Zamykanie okna nie zabija wszystkich procesów.

matplotlib.use('TkAgg') 

Ale nie wiem jak to naprawić! Jeśli to pomaga, uruchamiam 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

Powyższy kod jest poprawny; musi istnieć coś innego, co powstrzyma proces przed zatrzymaniem. Czy tworzysz procesy potomne lub wątki demona? –

+0

@AaronDigulla Problem pojawia się, gdy dane są drukowane. W przeciwnym razie wychodzi dobrze. Dodałem teraz cały kod z danymi fikcyjnymi, aby można je było odtworzyć. – Sepehr

+0

Czy zawiesza się podczas wychodzenia z danych na wykresie? Czy zawiesza się po zakończeniu spisku? –

Odpowiedz

2

Trzeba zadzwonić root.quit() zakończyć Tk.mainloop(). Na przykład zobacz answer here.

0

Rozwiązanie jest proste. Wystarczy użyć

from matplotlib.figure import Figure 

zamiast

import matplotlib.pyplot as plt 
0

Korzystanie root.mainloop zewnątrz funkcji, które powinny rozwiązać swoje problemy.

Powiązane problemy