2015-05-27 61 views
9

我有一個非常簡單的程序,可以在按下按鈕時顯示一個簡單的圖。我的問題是當我關閉應用程序窗口時,程序繼續運行,直到我從終端中終止它。下面是我的代碼和我的調查顯示問題是由關閉窗口不會終止所有進程

matplotlib.use('TkAgg') 

但我不知道如何解決它!如果有幫助,我在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

上面的代碼是正確的;必須有別的東西阻止進程停止。你是否創建子進程或守護進程線程? –

+0

@AaronDigulla繪製數據時出現問題。否則它退出罰款。現在我已經將整個代碼添加了虛擬數據,因此可以進行復制。 – Sepehr

+0

在數據繪製時退出時它會掛起嗎?繪圖結束後它會掛起嗎? –

回答

2

需要調用root.quit()結束Tk.mainloop()。例如,請參閱answer here

0

解決方案很簡單。只要使用的

from matplotlib.figure import Figure 

代替

import matplotlib.pyplot as plt 
0

使用root.mainloop之外的功能,這應該解決您的問題。