Comme son nom l'indique, PySimpleGUI facilite la création d'une interface graphique et vous pouvez également créer une interface graphique étonnamment performante. J'utilise PySimpleGUI principalement dans le but de créer des outils de recherche, mais je souhaite souvent intégrer des graphiques Matplotlib dans l'interface graphique. Cet article résume comment procéder. Le contenu de cet article est basé sur le livre de cuisine officiel et Git Hub.
Une onde de péché aléatoire est dessinée à chaque fois que vous appuyez sur le bouton Ajouter, et c'est un programme simple qui vous permet d'effacer la toile avec le bouton Effacer.
J'utilise Python 3.8.2. S'il s'agit d'un système à 3, cela fonctionnera sans aucun problème.
Le document officiel décrit comment installer avec pip, mais vous pouvez l'installer avec Anaconda sans aucun problème. J'utilise Anaconda.
pip install pysimplegui
or
conda install pysimplegui
Si vous ne pouvez pas installer avec conda
conda install -c conda-forge pysimplegui
S'il vous plaît essayez.
Je souhaite également utiliser Matplotlib, alors installez-le.
conda install matplotlib
embedded-matplotlib.py
import numpy as np
import PySimpleGUI as sg
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
#Fonctions pour éviter que l'interface graphique ne devienne floue
def make_dpi_aware():
import ctypes
import platform
if int(platform.release()) >= 8:
ctypes.windll.shcore.SetProcessDpiAwareness(True)
make_dpi_aware()
#Fonction de dessin
def draw_figure(canvas, figure):
figure_canvas_agg = FigureCanvasTkAgg(figure, canvas)
figure_canvas_agg.draw()
figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1)
return figure_canvas_agg
#Création de mise en page
layout = [[sg.Text('Embed Matplotlib Plot')],
[sg.Canvas(key='-CANVAS-')],
[sg.Button("Add"), sg.Button("Clear")]]
#Créez une fenêtre. finaliser=Doit être vrai.
window = sg.Window('Demo Application - Embedding Matplotlib In PySimpleGUI', layout, finalize=True, element_justification='center', font='Monospace 18')
#Créez une figue à incorporer.
fig = plt.figure(figsize=(5, 4))
ax = fig.add_subplot(111)
ax.set_ylim(-10, 10)
#Associez la figue à la toile.
fig_agg = draw_figure(window['-CANVAS-'].TKCanvas, fig)
#Boucle d'événement
while True:
event, values = window.read()
print(event, values)
# sg.Print(event, values)
if event in (None, "Cancel"):
break
elif event == "Add":
#Création de données de tracé appropriées
t = np.linspace(0, 7, 100)
afreq = np.random.randint(1, 10)
amp = np.random.randint(1, 10)
y = amp * np.sin(afreq * t)
#terrain
ax.plot(t, y, alpha=0.4)
#Après avoir apporté des modifications, fig_agg.draw()Reflétez le changement avec.
fig_agg.draw()
elif event == "Clear":
ax.cla()
fig_agg.draw()
#ferme la fenêtre.
window.close()
Pour la partie basique de PySimpleGUI, reportez-vous à la documentation officielle.
Bien que cela n'ait rien à voir avec le sujet principal, lorsqu'une fenêtre est affichée avec PySimpleGUI, la résolution peut devenir approximative et difficile à voir. La solution est d'exécuter la fonction make_dpi_aware
au début du programme. Selon l'environnement, il semble s'afficher sans problème. J'écris toujours ce processus au début de mon programme PySimple GUI. Voir Ce problème GitHub pour plus d'informations.
def make_dpi_aware():
import ctypes
import platform
if int(platform.release()) >= 8:
ctypes.windll.shcore.SetProcessDpiAwareness(True)
C'est le sujet principal.
Commencez par créer une fenêtre. L'important ici est d'utiliser Canvas comme élément pour incorporer le tracé et de spécifier finalize = True
lors de la création de la fenêtre.
#Création de mise en page
layout = [[sg.Text('Embed Matplotlib Plot')],
[sg.Canvas(key='-CANVAS-')],
[sg.Button("Add"), sg.Button("Clear")]]
#Créez une fenêtre. finaliser=Doit être vrai.
window = sg.Window('Demo Application - Embedding Matplotlib In PySimpleGUI', layout, finalize=True, element_justification='center', font='Monospace 18')
Ensuite, créez le tracé que vous souhaitez intégrer comme d'habitude.
fig = plt.figure(figsize=(5, 4))
ax = fig.add_subplot(111)
ax.set_ylim(-10, 10)
Ensuite, liez le tracé créé à l'élément Canvas. Vous aurez besoin de la valeur de retour de la fonction draw_figure
plus tard.
#Associez la figue à la toile.
fig_agg = draw_figure(window['-CANVAS-'].TKCanvas, fig)
La fonction draw_figure
utilisée ici est la suivante. En gros, il n'est pas nécessaire de modifier le contenu de cette fonction, et vous pouvez la copier et l'utiliser telle quelle. Pour l'utiliser, vous devez importer FigureCanvasTkAgg
comme indiqué sur la 4ème ligne du programme.
def draw_figure(canvas, figure):
figure_canvas_agg = FigureCanvasTkAgg(figure, canvas)
figure_canvas_agg.draw()
figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1)
return figure_canvas_agg
L'intégration est terminée jusqu'à présent.
Dans le programme créé, appuyez sur le bouton Ajouter pour ajouter une onde sinusoïdale au tracé. Pour mettre à jour le tracé de cette façon, lancez d'abord ʻax.plot () ʻet ensuitefig_agg.draw ()
pour refléter les changements dans le tracé.
#Création de données de tracé appropriées
t = np.linspace(0, 7, 100)
afreq = np.random.randint(1, 10)
amp = np.random.randint(1, 10)
y = amp * np.sin(afreq * t)
#terrain
ax.plot(t, y, alpha=0.4)
#Après avoir apporté des modifications, fig_agg.draw()Reflétez le changement avec.
fig_agg.draw()
Recommended Posts