From 2c6164567fc21013bf34ec0f68009822c9767034 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy Date: Sun, 26 Aug 2018 23:23:21 -0400 Subject: [PATCH 1/3] Animated Matplotlib demo! --- Demo_Matplotlib.py | 2 -- Demo_Matplotlib_Animated.py | 60 +++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 Demo_Matplotlib_Animated.py diff --git a/Demo_Matplotlib.py b/Demo_Matplotlib.py index ea6affc3..36cee679 100644 --- a/Demo_Matplotlib.py +++ b/Demo_Matplotlib.py @@ -5,7 +5,6 @@ from numpy import arange, sin, pi from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, FigureCanvasAgg from matplotlib.figure import Figure import matplotlib.backends.tkagg as tkagg -import sys import tkinter as Tk """ @@ -70,4 +69,3 @@ fig_photo = draw_figure(canvas_elem.TKCanvas, f) # show it all again and get buttons button, values = form.Read() - diff --git a/Demo_Matplotlib_Animated.py b/Demo_Matplotlib_Animated.py new file mode 100644 index 00000000..7616a6ec --- /dev/null +++ b/Demo_Matplotlib_Animated.py @@ -0,0 +1,60 @@ +from tkinter import * +from random import randint +import PySimpleGUI as g +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, FigureCanvasAgg +from matplotlib.figure import Figure +import matplotlib.backends.tkagg as tkagg +import tkinter as Tk + + +def main(): + fig = Figure() + + ax = fig.add_subplot(111) + ax.set_xlabel("X axis") + ax.set_ylabel("Y axis") + ax.grid() + + canvas_elem = g.Canvas(size=(640, 480)) # get the canvas we'll be drawing on + # define the form layout + layout = [[g.Text('Animated Matplotlib', size=(40,1), justification='center', font='Helvetica 20')], + [canvas_elem], + [g.ReadFormButton('Exit', size=(10,2), pad=((280, 0), 3), font='Helvetica 14')]] + + # create the form and show it without the plot + form = g.FlexForm('Demo Application - Embedding Matplotlib In PySimpleGUI') + form.Layout(layout) + form.ReadNonBlocking() + + graph = FigureCanvasTkAgg(fig, master=canvas_elem.TKCanvas) + canvas = canvas_elem.TKCanvas + + dpts = [randint(0, 10) for x in range(10000)] + for i in range(len(dpts)): + button, values = form.ReadNonBlocking() + if button is 'Exit' or values is None: + exit(69) + + ax.cla() + ax.grid() + + ax.plot(range(20), dpts[i:i+20], color='purple') + graph.draw() + figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds + figure_w, figure_h = int(figure_w), int(figure_h) + photo = Tk.PhotoImage(master=canvas, width=figure_w, height=figure_h) + + canvas.create_image(640/2, 480/2, image=photo) + + figure_canvas_agg = FigureCanvasAgg(fig) + figure_canvas_agg.draw() + + # Unfortunately, there's no accessor for the pointer to the native renderer + tkagg.blit(photo, figure_canvas_agg.get_renderer()._renderer, colormode=2) + + # time.sleep(.1) + + +if __name__ == '__main__': + main() + \ No newline at end of file From de4dd992c30ae4c2ad7ecaf00c72cd0f42c97913 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy Date: Mon, 27 Aug 2018 00:31:36 -0400 Subject: [PATCH 2/3] Updated animated demo --- Demo_Matplotlib_Animated.py | 3 ++- __pycache__/PySimpleGUI.cpython-36.pyc | Bin 0 -> 72905 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 __pycache__/PySimpleGUI.cpython-36.pyc diff --git a/Demo_Matplotlib_Animated.py b/Demo_Matplotlib_Animated.py index 7616a6ec..37212b45 100644 --- a/Demo_Matplotlib_Animated.py +++ b/Demo_Matplotlib_Animated.py @@ -6,6 +6,7 @@ from matplotlib.figure import Figure import matplotlib.backends.tkagg as tkagg import tkinter as Tk +VIEW_SIZE = 50 # number of data points visible on 1 screen def main(): fig = Figure() @@ -38,7 +39,7 @@ def main(): ax.cla() ax.grid() - ax.plot(range(20), dpts[i:i+20], color='purple') + ax.plot(range(VIEW_SIZE), dpts[i:i+VIEW_SIZE], color='purple') graph.draw() figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds figure_w, figure_h = int(figure_w), int(figure_h) diff --git a/__pycache__/PySimpleGUI.cpython-36.pyc b/__pycache__/PySimpleGUI.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d418c670c9bd0b1110d7aea55dfb10162a5d6ba1 GIT binary patch literal 72905 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 ADgXcg literal 0 HcmV?d00001 From adc887a9f6100d5d48fb70da2bfc9dacbed7b525 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy Date: Mon, 27 Aug 2018 00:53:00 -0400 Subject: [PATCH 3/3] Added animated Matplotlib --- docs/cookbook.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/docs/cookbook.md b/docs/cookbook.md index 4180f774..871ca197 100644 --- a/docs/cookbook.md +++ b/docs/cookbook.md @@ -685,7 +685,8 @@ There are a number of features used in this Recipe including: * Update of Elements in form (Input, Text) * do_not_clear of Input Elements -. + +![keypad 2](https://user-images.githubusercontent.com/13696193/44640891-57504d80-a992-11e8-93f4-4e97e586505e.jpg) @@ -701,7 +702,6 @@ There are a number of features used in this Recipe including: # Update of elements in form (Text, Input) # do_not_clear of Input elements - # create the 2 Elements we want to control outside the form out_elem = g.Text('', size=(15, 1), font=('Helvetica', 18), text_color='red') in_elem = g.Input(size=(10, 1), do_not_clear=True, key='input') @@ -734,3 +734,67 @@ There are a number of features used in this Recipe including: out_elem.Update(keys_entered) # output the final string in_elem.Update(keys_entered) # change the form to reflect current key string + +## Animated Matplotlib Graph + +Use the Canvas Element to create an animated graph. The code is a bit tricky to follow, but if you know Matplotlib then this recipe shouldn't be too difficult to copy and modify. + +![animated matplotlib](https://user-images.githubusercontent.com/13696193/44640937-91b9ea80-a992-11e8-9c1c-85ae74013679.jpg) + + + from tkinter import * + from random import randint + import PySimpleGUI as g + from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, FigureCanvasAgg + from matplotlib.figure import Figure + import matplotlib.backends.tkagg as tkagg + import tkinter as Tk + + + def main(): + fig = Figure() + + ax = fig.add_subplot(111) + ax.set_xlabel("X axis") + ax.set_ylabel("Y axis") + ax.grid() + + canvas_elem = g.Canvas(size=(640, 480)) # get the canvas we'll be drawing on + + layout = [[g.Text('Animated Matplotlib', size=(40, 1), justification='center', font='Helvetica 20')], + [canvas_elem], + [g.ReadFormButton('Exit', size=(10, 2), pad=((280, 0), 3), font='Helvetica 14')]] + + # create the form and show it without the plot + form = g.FlexForm('Demo Application - Embedding Matplotlib In PySimpleGUI') + form.Layout(layout) + form.ReadNonBlocking() + + graph = FigureCanvasTkAgg(fig, master=canvas_elem.TKCanvas) + canvas = canvas_elem.TKCanvas + + dpts = [randint(0, 10) for x in range(10000)] + for i in range(len(dpts)): + button, values = form.ReadNonBlocking() + if button is 'Exit' or values is None: + exit(69) + + ax.cla() + ax.grid() + + ax.plot(range(20), dpts[i:i + 20], color='purple') + graph.draw() + figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds + figure_w, figure_h = int(figure_w), int(figure_h) + photo = Tk.PhotoImage(master=canvas, width=figure_w, height=figure_h) + + canvas.create_image(640 / 2, 480 / 2, image=photo) + + figure_canvas_agg = FigureCanvasAgg(fig) + figure_canvas_agg.draw() + + tkagg.blit(photo, figure_canvas_agg.get_renderer()._renderer, colormode=2) + # time.sleep(.1) + + if __name__ == '__main__': + main()