Vous pouvez facilement créer une interface graphique même avec Python

Même Python veut créer une interface graphique

Lorsque vous exécutez et utilisez un programme écrit en Python, pensez-vous que ** "Ce serait pratique si vous pouviez entrer et sortir avec l'interface graphique ..." **?

Même si vous distribuez le programme à quelqu'un, CUI (entrée / sortie de la ligne de commande) n'est pas très gentil. Les CUI peuvent également être rejetées, en particulier pour les personnes ayant de faibles compétences informatiques.

** Si vous pouvez facilement créer une interface graphique avec Python ... **

Dans ce cas, pourquoi ne pas essayer d'utiliser ** PySimpleGui **? PySimpleGui est caractérisé par ** tout le monde peut facilement implémenter l'interface graphique **, et selon le document officiel de PySimpleGui, PySimpleGui est facile à apprendre et peut être appris rapidement. La quantité de code est d'environ 1/2 à 1/10 des autres bibliothèques GUI (Tkinter, Qt, WxPython, etc.).

Voir c'est croire, alors jetez d'abord un œil au code et aux résultats d'exécution ci-dessous.


import PySimpleGUI as sg

sg.theme('DarkAmber')   #Réglage du thème de conception

#Composants à placer dans la fenêtre
layout = [  [sg.Text('Ceci est la première ligne')],
            [sg.Text('Ceci est la deuxième ligne: veuillez saisir les caractères correctement'), sg.InputText()],
            [sg.Button('OK'), sg.Button('Annuler')] ]

#Génération de fenêtres
window = sg.Window('Exemple de programme', layout)

#Boucle d'événement
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == 'Annuler':
        break
    elif event == 'OK':
        print('Valeur que vous avez saisie:', values[0])

window.close()

** Résultat d'exécution **

pysimplegui_sample.png

C’est facile, non?

Le code se compose de cinq étapes principales. Les détails de chaque étape seront décrits plus tard, alors jetons un coup d'œil rapide au flux global.

Préparation (installation)

PySimpleGui n'est pas une bibliothèque standard, vous devez donc d'abord l'installer. Installons-le rapidement avec la commande pip ci-dessous.

pip install pysimplegui

code

Étape 1. Importez

Importez l'interface graphique PySimple. Pour le moment, il est standard de donner un alias de sg, donc cet article suivra cette convention.


import PySimpleGUI as sg

Étape 2. Définissez le thème de conception

Définissez la conception de l'interface graphique avec sg.theme (). Nous avons défini le thème «Ambre sombre» ici, mais 140 autres thèmes de conception sont disponibles.


sg.theme('DarkAmber')

Étape 3. Éléments et disposition de la fenêtre

C'est le cœur de l'interface graphique, mais nous allons définir les pièces (composants) à placer dans la fenêtre et la mise en page.


layout = [  [sg.Text('Ceci est la première ligne')],
            [sg.Text('Ceci est la deuxième ligne: veuillez saisir les caractères correctement'), sg.InputText()],
            [sg.Button('OK'), sg.Button('Annuler')] ]

Comment organiser les composants


layout = [  [Composant de 1ère ligne],
            [Composant de deuxième ligne],
            [Composant de 3e ligne] ]

Définissez les parties que vous souhaitez placer dans chaque ligne en les séparant par une virgule. C'est intuitif et facile à comprendre.

Lorsque vous organisez plusieurs parties sur une ligne, écrivez-les séparées par des virgules comme suit.


layout = [  [Composant 1 sur la première ligne,Composant 2 sur la première ligne],
            [Composant 1 sur la deuxième ligne],
            [Composant 1 sur la ligne 3,Composant 2 sur la ligne 3,Composant 3 sur la ligne 3,] ]

Étape 4. Créez une fenêtre

Créez une fenêtre en spécifiant la mise en page créée à l'étape 3 dans sg.Window (). À ce stade, vous pouvez spécifier le titre de la fenêtre comme premier argument.


window = sg.Window('Exemple de programme', layout)

Étape 5. Boucle d'événements

Attendez que l'événement se produise dans la boucle d'événements. Recevez l'événement avec window.read (). A la réception de l'événement, l'action à effectuer par l'événement est sélectionnée et exécutée.

Dans l'exemple de code

--Le bouton X de la fenêtre a été enfoncé (sg.WIN_CLOSED) → quitter la boucle et fermer la fenêtre (window.close ()) --Le bouton 'Annuler' a été enfoncé → Quitter la boucle et fermer la fenêtre (window.close ()) --Le bouton'OK'a été enfoncé → La valeur saisie dans la zone de texte est affichée dans l'instruction d'impression.

Exécute le traitement des événements.


while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == 'Annuler':
        break
    elif event == 'OK':
        print('Valeur que vous avez saisie:', values[0])

window.close()

Essayez de créer une interface graphique

Expliquons tout en faisant les choses.

Le code introduit dans l'article "[Automation] Extraction de tableaux en PDF avec Python" a été légèrement modifié, et ** "Page spécifiée du fichier PDF" Créons un programme qui extrait la table à l'intérieur et la convertit en csv "** avec une interface graphique.

La partie qui extrait le tableau dans la page spécifiée du fichier PDF avec DataFrame est transformée en fonction. Cette fois, ce n'est pas important, je vais donc omettre l'explication. Pour plus de détails, voir «[Automation] Extraire des tableaux au format PDF avec Python».


import pandas as pd
import tabula

def readTableFromPDF(filePath, isLattice, targetPages):
    '''
Lit une table à partir d'un fichier PDF avec le filePath spécifié et le convertit en DataFramle
    '''
    dfs = tabula.read_pdf(filePath, lattice=isLattice, pages=targetPages)

    #Afficher le DataFrame converti
    for index, df in enumerate(dfs):
        print("----------table"+str(index+1)+"----------")
        print(df.head())
        
    return dfs

Préparation (conception de l'interface graphique)

Tout d'abord, décidez quel type d'interface graphique vous souhaitez concevoir. Cela peut être papier ou électronique, alors j'écrirai le dessin.

J'ai pensé à une telle interface graphique.

gui_design.png

Étape 1. Importez

Importez la GUI PySimple avec le nom sg.


import PySimpleGUI as sg

Étape 2. Définissez le thème de conception

Définissez le thème de conception de l'interface graphique avec sg.theme ().

Il existe différents thèmes disponibles, mais vous pouvez voir la liste des thèmes en appelant la fonction sg.theme_previewer ().


sg.theme_previewer() #Afficher une liste de thèmes de conception

Veuillez également vous référer au site officiel lors du choix. Explosion du thème Look and Feel

Ici, je vais le faire avec le thème de Dark Teal7.


sg.theme('DarkTeal7')

Étape 3. Éléments et disposition de la fenêtre

Considérez la proposition de conception GUI ligne par ligne. gui_design1.png

Il y a 6 lignes au total, donc le code ressemble à ceci:

layout = [  [Composant de 1ère ligne],
            [Composant de deuxième ligne],
            [Composant de 3e ligne],
            [Composant en ligne 4],
            [Composant en ligne 5],
            [Composant en ligne 6]  ]

Regardons chaque ligne tour à tour.

La première ligne

gui_design_row1.png

La première ligne affiche simplement le texte. Placez le texte comme sg.Text (" texte que vous voulez afficher ").

    [sg.Text('Veuillez spécifier le fichier et la page à lire')]

2e ligne

gui_design_row2.png

La deuxième ligne place les trois composants.

■ Premier composant (texte) Le texte est le même que la première ligne et est placé avec sg.Text (). Selon la disposition, vous souhaiterez peut-être spécifier la taille du composant. Dans ce cas, spécifiez-le sous la forme sg.Text ('texte que vous voulez afficher', taille = (" largeur "," hauteur ")).

■ Deuxième et troisième composants (bouton du navigateur de fichiers) Un bouton pour sélectionner un fichier dans le navigateur. Placez-le avec sg.FileBrowse ('texte que vous voulez afficher sur le bouton'). Le chemin du fichier sélectionné est affiché dans la case placée par sg.Input ().

Chaque composant peut recevoir un nom pour identifier ce ** composant sous la forme «key = 'name». ** ** Lorsqu'un événement tel que "bouton enfoncé" se produit, vous devez identifier le bouton qui a été enfoncé, n'est-ce pas? Assurez-vous de donner un nom au composant dont vous souhaitez gérer l'événement, car vous en aurez besoin à ce moment-là.

Vous devrez obtenir le chemin du fichier plus tard, alors donnez-lui un nom pour sg.FileBrowse ().


    [sg.Text('Fichier', size=(15, 1)), sg.Input(), sg.FileBrowse('Fichierを選択', key='inputFilePath')]

3e ligne

gui_design_row3.png

La troisième ligne place également trois composants.

■ Premier composant (texte) Placez-le avec sg.Text ().

■ Deuxième composant (zone de texte) La zone de saisie de texte est «sg.InputText ()». Donnez également un nom à ce composant.

■ Troisième composant (texte) Placez-le avec sg.Text (). Puisque le nombre de caractères est un peu grand, spécifiez 2 pour "largeur verticale" de `size = (" width "," vertical width ")) pour l'afficher sous forme de deux lignes de texte.

sg.Text ('Veuillez spécifier \ n3-10 pour plusieurs pages', size = (30, 2))

    [sg.Text('page', size=(15, 1)), sg.InputText('', size=(10, 1), key='pages'), sg.Text('複数pageのときは\n3-Veuillez spécifier 10', size=(30, 2))]

4ème ligne

gui_design_row4.png

La quatrième ligne place les deux composants.

■ Premier composant (texte) Placez-le avec sg.Text ().

■ Deuxième composant (menu déroulant) Le menu déroulant est sg.Combo ((" value 1 "," value 2 ", ...), default_value =" value n "). Donnez également un nom à ce composant.


    [sg.Text('Bordure de table', size=(15, 1)),sg.Combo(('Oui', 'Aucun'), default_value="Oui",size=(10, 1), key='lattice')]

5ème ligne

gui_design_row5.png

La cinquième ligne place les deux composants.

■ Premier et deuxième composants (boutons) Placez le bouton avec sg.Button ('texte que vous voulez afficher sur le bouton'). Je veux gérer l'événement lorsque le bouton est enfoncé, donc je les nomme également avec key = 'name'.


    [sg.Button('en train de lire', key='read'), sg.Button('Enregistrer dans csv', key='save')]

6ème ligne

gui_design_row6.png

Il n'y a qu'un seul composant dans cette ligne. Le tableau lu à partir du fichier PDF est affiché ici pour confirmation.

Utilisez sg.Output (size = (" width "," height ")) pour afficher le texte.


    [sg.Output(size=(80,20))]

Résumé des composants

Écris ensemble les composants des lignes 1 à 6.


layout = [
    [sg.Text('Veuillez spécifier le fichier et la page à lire')],
    [sg.Text('Fichier', size=(10, 1)), sg.Input(), sg.FileBrowse('Fichierを選択', key='inputFilePath')],
    [sg.Text('page', size=(10, 1)), sg.InputText('', size=(10, 1), key='pages'), sg.Text('複数pageのときは\n3-Veuillez spécifier 10', size=(30, 2))],
    [sg.Text('Bordure de table', size=(10, 1)),sg.Combo(('Oui', 'Aucun'), default_value="Oui",size=(10, 1), key='lattice')],
    [sg.Button('en train de lire', key='read'), sg.Button('Enregistrer dans csv', key='save')],
    [sg.Output(size=(80,20))]
]

Étape 4. Créez une fenêtre

Créez une fenêtre avec la mise en page créée à l'étape 3. Le titre de la fenêtre doit être "Outil d'extraction de tableau PDF".


window = sg.Window('Outil pour extraire le tableau PDF', layout)

Étape 5. Boucle d'événements

C'est la dernière étape. C'est également une étape très importante.

Attendez que l'événement se produise dans la boucle d'événements. Recevez l'événement avec window.read (). A la réception de l'événement, l'action à effectuer par l'événement est sélectionnée et exécutée.


while True:
    event, values = window.read()

    if event == sg.WIN_CLOSED: #Que se passe-t-il lorsque vous appuyez sur le bouton X de la fenêtre
        break
       
    if event == 'Nom de l'événement 1':
        #Traitement lorsque le nom d'événement 1 se produit

    if event == 'Nom de l'événement 2':
        #Traitement lorsque le nom d'événement 2 se produit

window.close()

La valeur de retour de window.read (), event, contient le nom donné à chaque composant avec key = 'name'. Par exemple, le bouton «lire» est nommé «lire», donc si ce bouton est enfoncé, l'événement aura le nom «lire».

values contient les valeurs de chaque composant, qui peuvent également être récupérées en spécifiant le nom donné à chaque composant avec clé = 'nom'. Par exemple, la valeur du menu déroulant ('Oui' ou 'Non') sur la 4ème ligne peut être obtenue avec les valeurs ['lattice'].

Il existe deux types de gestion des événements cette fois.

un événement un événement名 Que faire
Le bouton "lire" a été enfoncé 'read' readTableFromPDF()Courir
Le bouton "Enregistrer dans csv" a été enfoncé 'save' readTableFromPDF()Et enregistrez le DataFrame obtenu comme valeur de retour en tant que csv

while True:
    event, values = window.read()

    if event == sg.WIN_CLOSED: #Que se passe-t-il lorsque vous appuyez sur le bouton X de la fenêtre
        break
       
    if event == 'read': #Que faire lorsque vous appuyez sur le bouton «lire»
        if values['lattice'] == 'Oui':
            isLattice = True
        else:
            isLattice = False
            
        readTableFromPDF(values['inputFilePath'], isLattice, values['pages'])
        
    if event == 'save': #Traitement lorsque vous appuyez sur le bouton "Enregistrer dans csv"
        if values['lattice'] == 'Oui':
            isLattice = True
        else:
            isLattice = False
            
        dfs = readTableFromPDF(values['inputFilePath'], isLattice, values['pages'])
        
        for index, df in enumerate(dfs):
            basename_without_ext = os.path.splitext(os.path.basename(values['inputFilePath']))[0] #Extraire le nom du fichier PDF
            filename = basename_without_ext + "_"  + str(index+1) +".csv"
            df.to_csv(filename, index=None)
            print("Enregistré dans un fichier csv:", filename)
            
        print("Tous les fichiers csv ont été enregistrés")

window.close()

Le résultat de l'instruction d'impression ici est affiché dans la boîte de sg.Output () qui est le composant sur la 6ème ligne.

Résumé du code GUI à ce jour

Rassemblez tout le code des étapes 1 à 5.

#étape 1.importer
import PySimpleGUI as sg
import os

#Étape 2.Réglage du thème de conception
sg.theme('DarkTeal7')

#Étape 3.Éléments de fenêtre et disposition
layout = [
    [sg.Text('Veuillez spécifier le fichier et la page à lire')],
    [sg.Text('Fichier', size=(10, 1)), sg.Input(), sg.FileBrowse('Fichierを選択', key='inputFilePath')],
    [sg.Text('page', size=(10, 1)), sg.InputText('', size=(10, 1), key='pages'), sg.Text('複数pageのときは\n3-Veuillez spécifier 10', size=(30, 2))],
    [sg.Text('Bordure de table', size=(10, 1)),sg.Combo(('Oui', 'Aucun'), default_value="Oui",size=(10, 1), key='lattice')],
    [sg.Button('en train de lire', key='read'), sg.Button('Enregistrer dans csv', key='save')],
    [sg.Output(size=(80,20))]
]

#Étape 4.Génération de fenêtres
window = sg.Window('Outil pour extraire le tableau PDF', layout)

#Étape 5.Boucle d'événement
while True:
    event, values = window.read()

    if event == sg.WIN_CLOSED: #Que se passe-t-il lorsque vous appuyez sur le bouton X de la fenêtre
        break
       
    if event == 'read': #Que faire lorsque vous appuyez sur le bouton «lire»
        if values['lattice'] == 'Oui':
            isLattice = True
        else:
            isLattice = False
            
        readTableFromPDF(values['inputFilePath'], isLattice, values['pages'])
        
    if event == 'save': #Traitement lorsque vous appuyez sur le bouton "Enregistrer dans csv"
        if values['lattice'] == 'Oui':
            isLattice = True
        else:
            isLattice = False
            
        dfs = readTableFromPDF(values['inputFilePath'], isLattice, values['pages'])
        
        for index, df in enumerate(dfs):
            basename_without_ext = os.path.splitext(os.path.basename(values['inputFilePath']))[0] #Extraire le nom du fichier PDF
            filename = basename_without_ext + "_"  + str(index+1) +".csv"
            df.to_csv(filename, index=None)
            print("Enregistré dans un fichier csv:", filename)
            
        print("Tous les fichiers csv ont été enregistrés")

window.close()

Interface graphique terminée

Lorsque vous exécutez le code ci-dessus, l'interface graphique suivante s'affiche. C'est presque aussi conçu.

gui_pdfreader1.png

Spécifiez le fichier PDF et la page et essayez de «lire».

gui_pdfreader2.png

Vous pouvez lire correctement les pages du fichier PDF!

Après tout, l'interface graphique doit être amusante

Comme son nom l'indique, PySimpleGui vous permet d'écrire des interfaces graphiques simplement, j'ai donc pu créer une interface graphique tout en m'amusant. Les composants présentés ici sont très basiques, mais vous pouvez facilement créer divers autres composants. Malheureusement, il existe peu de documents japonais pour PySimpleGui, mais j'espère que vous apprécierez la création d'une interface graphique en vous référant au site suivant.

Officiel PySimpleGui Ceci est le site officiel de PySimpleGui.

Utilisation de base de l'interface graphique PySimple Je pense que le texte lié dans l'article est actuellement l'un des rares textes japonais de PySimple Gui. Je l'ai également utilisé comme référence.

Recommended Posts

Vous pouvez facilement créer une interface graphique même avec Python
Facile à créer une application console Python avec Click
Créer un répertoire avec python
Créer une interface graphique python à l'aide de tkinter
Créez un environnement virtuel avec Python!
Python | Ce que vous pouvez faire avec Python
Créer une interface graphique aussi facilement que possible avec python [édition tkinter]
Créer un décorateur de fonction Python avec Class
Créez une image factice avec Python + PIL.
Créer une application GUI simple en Python
[Python] Créez un environnement virtuel avec Anaconda
Créons un groupe gratuit avec Python
Créer une application graphique avec Tkinter de Python
Créer un compteur de fréquence de mots avec Python 3.4
Jusqu'à ce que vous puissiez utiliser opencv avec python
Créer un cadre avec un arrière-plan transparent avec tkinter [Python]
J'ai créé une application graphique avec Python + PyQt5
Créer un module Python
Créer un fichier exécutable GUI créé avec tkinter
Créer un LINE BOT avec Minette pour Python
Créez une application Web qui peut être facilement visualisée avec Plotly Dash
Créer un environnement virtuel avec conda avec Python
Créer une page qui se charge indéfiniment avec python
Créer un environnement de construction python3 avec Sublime Text3
Créer une barre de couleurs avec Python + Qt (PySide)
Étapes pour créer un bot Twitter avec Python
Faites facilement un bip avec python
Créer un arbre de décision à partir de 0 avec Python (1. Présentation)
Créer une nouvelle page en confluence avec Python
Créer un widget avec une couleur spécifiée avec Python + Qt (PySide)
Créer un fichier au format Photoshop (.psd) avec python
Créer un environnement Python
Ouvrir la boîte de dialogue de fichier avec l'interface graphique Python (tkinter.filedialog)
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python
Créez une application graphique native avec Py2app et Tkinter
[Python] Générer ValueObject avec un constructeur complet à l'aide de classes de données
Créez un environnement de développement python avec vagrant + ansible + fabric
Créer une couche pour AWS Lambda Python dans Docker
[python] Créez un tableau de dates avec des incréments arbitraires avec np.arange
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
[Python] Créez un fichier de distribution pour le programme Tkinter avec cx_Freeze
Créez un faux serveur Minecraft en Python avec Quarry
Créer un fichier CAO 2D ".dxf" avec python [ezdxf]
Facilement sans serveur avec Python en utilisant Calice
Créer un dictionnaire en Python
Créer un gif 3D avec python3
Créer une page d'accueil avec django
[GUI en Python] PyQt5-Layout management-
Créer un tableau numpy python
Faites une loterie avec Python
[GUI avec Python] PyQt5-Préparation-
Créez facilement un profil avec un décorateur
[GUI avec Python] PyQt5 -Paint-
Prise en compte du moment où vous pouvez faire du bon travail en 10 ans avec Python3 et Scala3.
Jusqu'à ce que vous créiez un environnement d'apprentissage automatique avec Python sur Windows 7 et que vous l'exécutiez