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



我正在用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

程序可以工作,当我打开数据文件并点击"绘图"按钮时,它会创建一个图形窗口(通过matplotlib),但在我关闭图形窗口之前GUI无法继续处理。但是,我想在保持当前图形的同时继续绘制下一个图形,我该如何实现这一点?

您可以在Tk GUI中嵌入matplotlib图形:

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

最新更新