开发者

Let Tkinter continue to process next event without closing current pop-up window

I am using tkinter to write a simple GUI program to plot figure of some data, the plot function is realized using matplotlib module, here is my simplified code:

#!/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(sel开发者_JAVA技巧f):
        berplot(self.fullfilenames)            


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

berplot() is a function in another python module as:

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

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

The program can work, when I open the data file and click "Plot" button, it will create a figure window(by the matplotlib), but the GUI can not continue to process before I close the figure window. However, I want to continue to draw next figure while keeping current one, How can I realize this?


you can embed matplotlib figure in to 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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜