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
精彩评论