Demo - Matplotlib with toolbar embedded into GUI
This commit is contained in:
parent
094622e5be
commit
1bf54c3d27
|
@ -0,0 +1,81 @@
|
|||
import PySimpleGUI as sg
|
||||
import numpy as np
|
||||
|
||||
"""
|
||||
Embedding the Matplotlib toolbar into your application
|
||||
|
||||
"""
|
||||
|
||||
# ------------------------------- This is to include a matplotlib figure in a Tkinter canvas
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
|
||||
|
||||
|
||||
def draw_figure_w_toolbar(canvas, fig, canvas_toolbar):
|
||||
if canvas.children:
|
||||
for child in canvas.winfo_children():
|
||||
child.destroy()
|
||||
if canvas_toolbar.children:
|
||||
for child in canvas_toolbar.winfo_children():
|
||||
child.destroy()
|
||||
figure_canvas_agg = FigureCanvasTkAgg(fig, master=canvas)
|
||||
figure_canvas_agg.draw()
|
||||
toolbar = Toolbar(figure_canvas_agg, canvas_toolbar)
|
||||
toolbar.update()
|
||||
figure_canvas_agg.get_tk_widget().pack(side='right', fill='both', expand=1)
|
||||
|
||||
|
||||
class Toolbar(NavigationToolbar2Tk):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(Toolbar, self).__init__(*args, **kwargs)
|
||||
|
||||
|
||||
# ------------------------------- PySimpleGUI CODE
|
||||
|
||||
layout = [
|
||||
[sg.T('Graph: y=sin(x)')],
|
||||
[sg.B('Plot'), sg.B('Exit')],
|
||||
[sg.T('Controls:')],
|
||||
[sg.Canvas(key='controls_cv')],
|
||||
[sg.T('Figure:')],
|
||||
[sg.Column(
|
||||
layout=[
|
||||
[sg.Canvas(key='fig_cv',
|
||||
# it's important that you set this size
|
||||
size=(400 * 2, 400)
|
||||
)]
|
||||
],
|
||||
background_color='#DAE0E6',
|
||||
pad=(0, 0)
|
||||
)],
|
||||
[sg.B('Alive?')]
|
||||
|
||||
]
|
||||
|
||||
window = sg.Window('Graph with controls', layout)
|
||||
|
||||
while True:
|
||||
event, values = window.read()
|
||||
print(event, values)
|
||||
if event in (None, 'Exit'): # always, always give a way out!
|
||||
break
|
||||
elif event is 'Plot':
|
||||
# ------------------------------- PASTE YOUR MATPLOTLIB CODE HERE
|
||||
plt.figure(1)
|
||||
fig = plt.gcf()
|
||||
DPI = fig.get_dpi()
|
||||
# ------------------------------- you have to play with this size to reduce the movement error when the mouse hovers over the figure, it's close to canvas size
|
||||
fig.set_size_inches(404 * 2 / float(DPI), 404 / float(DPI))
|
||||
# -------------------------------
|
||||
x = np.linspace(0, 2 * np.pi)
|
||||
y = np.sin(x)
|
||||
plt.plot(x, y)
|
||||
plt.title('y=sin(x)')
|
||||
plt.xlabel('X')
|
||||
plt.ylabel('Y')
|
||||
plt.grid()
|
||||
|
||||
# ------------------------------- Instead of plt.show()
|
||||
draw_figure_w_toolbar(window['fig_cv'].TKCanvas, fig, window['controls_cv'].TKCanvas)
|
||||
|
||||
window.close()
|
Loading…
Reference in New Issue