[PYTHON] Je veux intégrer Matplotlib dans PySimpleGUI

introduction

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.

Que faire dans cet article

image.png

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.

Installation

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

programme

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()

Commentaire

Pour la partie basique de PySimpleGUI, reportez-vous à la documentation officielle.

Problème de résolution de fenêtre approximative

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)

Intégrer le tracé Matplotlib

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.

Mettre à jour le tracé

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

Je veux intégrer Matplotlib dans PySimpleGUI
Je souhaite intégrer une variable dans une chaîne Python
Je veux imprimer dans la notation d'inclusion
Je veux faire de matplotlib un thème sombre
Je veux faire le test de Dunnett en Python
Je veux corriger Datetime.now dans le test de Django
Je souhaite afficher plusieurs images avec matplotlib.
Je souhaite stocker les informations de la base de données dans la liste
Je veux fusionner des dictionnaires imbriqués en Python
Je veux afficher la progression en Python!
Je veux changer la couleur en cliquant sur le point de dispersion dans matplotlib
Je veux écrire en Python! (1) Vérification du format de code
Je veux facilement implémenter le délai d'expiration en python
Je veux faire la transition avec un bouton sur le ballon
Je veux utiliser self avec Backpropagation (tf.custom_gradient) (tensorflow)
Intégrer le graphe matplotlib dans Tkinter
Je veux écrire en Python! (2) Écrivons un test
Même avec JavaScript, je veux voir Python `range ()`!
Je veux échantillonner au hasard un fichier avec Python
Je veux résoudre SUDOKU
Je veux travailler avec un robot en python.
Je veux écrire en Python! (3) Utiliser des simulacres
Je souhaite créer manuellement une légende avec matplotlib
Je veux utiliser le jeu de données R avec python
Je veux faire quelque chose avec Python à la fin
Je veux manipuler des chaînes dans Kotlin comme Python!
[Django] Je souhaite me connecter automatiquement après une nouvelle inscription
Je veux rendre le type de dictionnaire dans la liste unique
[Introduction à Pytorch] Je souhaite générer des phrases dans des articles de presse
Je veux aligner les nombres valides dans le tableau Numpy
Je veux pouvoir exécuter Python avec VS Code
Je veux ajouter un joli complément à input () en python
Je ne voulais pas écrire la clé AWS dans le programme
Je veux comprendre à peu près systemd
Je veux gratter des images et les former
Je veux faire ○○ avec les Pandas
Je veux copier l'annotation de yolo
Je veux déboguer avec Python
[Linux] Je souhaite connaître la date à laquelle l'utilisateur s'est connecté
Je veux utiliser des rails avec des rails même dans un environnement vagabond
Développement LINEbot, je souhaite vérifier le fonctionnement dans l'environnement local
[Couches Python / AWS Lambda] Je souhaite réutiliser uniquement le module dans AWS Lambda Layers
Je veux créer un fichier pip et le refléter dans le menu fixe
Je veux faire de la deuxième ligne le nom de la colonne dans pandas
Je veux réussir le test G dans un mois Jour 1
Je veux connaître la population de chaque pays du monde.
Je veux épingler Spyder à la barre des tâches
J'ai essayé d'implémenter PLSA en Python
Comment supprimer l'erreur d'affichage dans matplotlib
Je veux sortir froidement sur la console
J'ai essayé d'implémenter la permutation en Python
Je veux les gratter tous ensemble.
Je veux gérer la rime part1
Je veux savoir comment fonctionne LINUX!
Je veux gérer la rime part3
J'ai essayé d'implémenter PLSA dans Python 2
Je veux utiliser jar de python
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
J'ai essayé d'implémenter ADALINE en Python
Je souhaite utiliser la console IPython Qt