让Tkinter继续处理下一个事件而不关闭当前弹出窗口

时间:2011-08-11 03:04:50

标签: python matplotlib tkinter

我正在使用tkinter编写一个简单的GUI程序来绘制一些数据的图形,使用matplotlib模块实现绘图功能,这里是我的简化代码:

#!/usr/bin/env python
import Tkinter, tkFileDialog, tkMessageBox
from plot_core import berplot

class BerPlotTk(Tkinter.Frame):
    def __init__ (self, master = None):
        Tkinter.Frame.__init__(self, master, width = 500, height = 200)
        self.fullfilenames = [] # filename with path            
        self.master = master   
        self.CreateWidgets()

    def CreateWidgets(self):
        # other widgets...

        # Buttons
        self.button_sel = Tkinter.Button(self, text = "Open", command = self.Open)                          
        self.button_sel.grid(column = 0, row = 7, sticky = "EW")
        self.button_plot = Tkinter.Button(self, text = "Plot", command = self.Plot)                                              
        self.button_plot.grid(column = 2, row = 7, sticky = "EW")            
        self.button_exit = Tkinter.Button(self, text = "Exit", command = self.top.quit)                                              
        self.button_exit.grid(column = 3, row = 7, sticky = "EW")

    def Open(self):
        input_filenames = tkFileDialog.askopenfilename(parent = self.master,
                                    title = "Select the log file")
        self.fullfilenames = list(self.tk.splitlist(input_filenames))

    def Plot(self):
        berplot(self.fullfilenames)            


if __name__ == "__main__":
    root = Tkinter.Tk()
    app = BerPlotTk(root)
    root.mainloop()
    root.destroy()

berplot()是另一个python模块中的函数:

from matplotlib.pyplot import * 
def berplot(filelist):

    # retrieve data x, y from the log file
    # ...        
    ber = semilogy(x, y)
    # ...
    show()
    return 1

该程序可以工作,当我打开数据文件并单击“Plot”按钮时,它将创建一个图形窗口(由matplotlib),但是在关闭图形窗口之前GUI无法继续处理。但是,我想继续绘制下一个数字,同时保持当前的数字,我怎么能意识到这一点?

1 个答案:

答案 0 :(得分:1)

你可以将matplotlib数字嵌入到Tk GUI:

import matplotlib
matplotlib.use('TkAgg')

from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import Tkinter as Tk

class TkPlot(Tk.Frame):
    def __init__ (self, master = None):
        Tk.Frame.__init__(self, master, width = 500, height = 200)
        self.CreateWidgets()

    def CreateWidgets(self):
        self.button = Tk.Button(root, text="Plot", command=self.Plot)
        self.button.pack()
        self.figure = Figure(figsize=(5,4), dpi=100)

        canvas = FigureCanvasTkAgg(self.figure, master=root)
        canvas.show()
        canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

        toolbar = NavigationToolbar2TkAgg( canvas, root )
        toolbar.update()
        canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

    def Plot(self):
        a = self.figure.add_subplot(111)
        t = arange(0.0,3.0,0.01)
        s = sin(2*pi*t)
        a.plot(t,s)
        self.figure.canvas.draw()

if __name__ == "__main__":
    root = Tk.Tk()
    app = TkPlot(root)
    root.mainloop()

http://matplotlib.sourceforge.net/examples/user_interfaces/index.html