2015-05-27 24 views
9

Tôi có một chương trình rất đơn giản hiển thị một âm mưu đơn giản trên một nút bấm. Vấn đề của tôi là khi tôi đóng cửa sổ ứng dụng, chương trình tiếp tục chạy cho đến khi tôi xóa nó khỏi thiết bị đầu cuối. Dưới đây là mã của tôi và điều tra của tôi cho thấy vấn đề là doĐóng cửa sổ không giết tất cả các quy trình

matplotlib.use('TkAgg') 

Nhưng tôi không biết cách khắc phục! Nếu nó giúp, tôi đang chạy trên 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

Mã ở trên là chính xác; phải có cái gì khác ngăn cản quá trình dừng lại. Bạn có tạo các tiến trình con hoặc các chuỗi daemon không? –

+0

@AaronDigulla Vấn đề phát sinh khi dữ liệu được vẽ. Nếu không nó thoát khỏi tốt. Bây giờ tôi đã thêm toàn bộ mã với dữ liệu giả để nó có thể được sao chép lại. – Sepehr

+0

Nó có treo khi bạn thoát ra trong khi dữ liệu được vẽ không? Liệu nó có treo, sau khi âm mưu đã kết thúc? –

Trả lời

2

Bạn cần gọi root.quit() để kết thúc Tk.mainloop(). Ví dụ: xem answer here.

0

Giải pháp rất đơn giản. Chỉ cần sử dụng

from matplotlib.figure import Figure 

thay vì

import matplotlib.pyplot as plt 
0

Sử dụng root.mainloop bên ngoài của một hàm, mà nên giải quyết vấn đề của bạn.

Các vấn đề liên quan