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 **
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.
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
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
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')
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,] ]
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)
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()
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
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.
Importez la GUI PySimple avec le nom sg
.
import PySimpleGUI as sg
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')
Considérez la proposition de conception GUI ligne par ligne.
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 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')]
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')]
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))]
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')]
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')]
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))]
É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))]
]
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)
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.
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()
Lorsque vous exécutez le code ci-dessus, l'interface graphique suivante s'affiche. C'est presque aussi conçu.
Spécifiez le fichier PDF et la page et essayez de «lire».
Vous pouvez lire correctement les pages du fichier PDF!
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