Denken Sie jemals, wenn Sie ein in Python geschriebenes Programm ausführen und verwenden, dass ** "es praktisch wäre, wenn Sie mit GUI eingeben und ausgeben könnten ..." **?
Selbst wenn Sie das Programm an jemanden verteilen, ist die CUI (Eingabe / Ausgabe über die Befehlszeile) nicht sehr freundlich. CUI kann auch abgelehnt werden, insbesondere für Personen mit geringen IT-Kenntnissen.
** Wenn Sie mit Python einfach eine GUI erstellen können ... **
In diesem Fall versuchen Sie es mit ** PySimpleGui **. PySimpleGui zeichnet sich dadurch aus, dass ** jeder die GUI leicht implementieren kann ** und laut PySimpleGui Official Document PySimpleGui leicht zu erlernen ist. Die Codemenge beträgt ungefähr 1/2 bis 1/10 anderer GUI-Bibliotheken (Tkinter, Qt, WxPython usw.).
Sehen ist Glauben, schauen Sie sich also zuerst den Code und die Ausführungsergebnisse unten an.
import PySimpleGUI as sg
sg.theme('DarkAmber') #Design-Themeneinstellung
#Komponenten, die im Fenster platziert werden sollen
layout = [ [sg.Text('Dies ist die erste Zeile')],
[sg.Text('Dies ist die zweite Zeile: Bitte geben Sie die entsprechenden Zeichen ein'), sg.InputText()],
[sg.Button('OK'), sg.Button('Stornieren')] ]
#Fenstergenerierung
window = sg.Window('Beispielprogramm', layout)
#Ereignisschleife
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'Stornieren':
break
elif event == 'OK':
print('Wert, den Sie eingegeben haben:', values[0])
window.close()
** Ausführungsergebnis **
Es ist einfach, oder?
Der Code besteht aus fünf Hauptschritten. Die Details der einzelnen Schritte werden später beschrieben. Schauen wir uns also kurz den Gesamtablauf an.
PySimpleGui ist keine Standardbibliothek, daher müssen Sie sie zuerst installieren. Lassen Sie es uns schnell mit dem folgenden Befehl pip installieren.
pip install pysimplegui
Importieren Sie die PySimple-GUI. Derzeit ist es Standard, einen Alias von "sg" anzugeben, daher folgt dieser Artikel dieser Konvention.
import PySimpleGUI as sg
Legen Sie das GUI-Design mit sg.theme ()
fest.
Wir haben das Thema "Dark Amber" hier festgelegt, aber es sind 140 weitere Designthemen verfügbar.
sg.theme('DarkAmber')
Dies ist das Herzstück der GUI, aber wir werden die Teile (Komponenten) festlegen, die im Fenster und im Layout platziert werden sollen.
layout = [ [sg.Text('Dies ist die erste Zeile')],
[sg.Text('Dies ist die zweite Zeile: Bitte geben Sie die entsprechenden Zeichen ein'), sg.InputText()],
[sg.Button('OK'), sg.Button('Stornieren')] ]
So ordnen Sie die Komponenten an
layout = [ [1. Zeile Komponente],
[Komponente der zweiten Zeile],
[3. Zeile Komponente] ]
Legen Sie die Teile fest, die Sie in jede Zeile einfügen möchten, indem Sie sie durch ein Komma trennen. Es ist intuitiv und leicht zu verstehen.
Wenn Sie mehrere Teile in einer Zeile anordnen, schreiben Sie sie wie folgt durch Kommas getrennt.
layout = [ [Komponente 1 in der ersten Zeile,Komponente 2 in der ersten Zeile],
[Komponente 1 in der zweiten Zeile],
[Komponente 1 in Zeile 3,Komponente 2 in Zeile 3,Komponente 3 in Zeile 3,] ]
Erstellen Sie ein Fenster, indem Sie das in Schritt 3 erstellte Layout in sg.Window ()
angeben.
Zu diesem Zeitpunkt können Sie den Fenstertitel als erstes Argument angeben.
window = sg.Window('Beispielprogramm', layout)
Warten Sie, bis das Ereignis in der Ereignisschleife auftritt.
Empfangen Sie das Ereignis mit window.read ()
. Wenn das Ereignis empfangen wird, wird die vom Ereignis auszuführende Aktion ausgewählt und ausgeführt.
Im Beispielcode
--Die X-Taste des Fensters wurde gedrückt (sg.WIN_CLOSED
) → Verlasse die Schleife und schließe das Fenster (window.close ()
)
--Die Schaltfläche 'Abbrechen' wurde gedrückt → Schleife verlassen und Fenster schließen (window.close ()
)
--Die 'OK'-Taste wurde gedrückt → Der im Textfeld eingegebene Wert wird in der print-Anweisung angezeigt.
Führt die Ereignisverarbeitung aus.
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'Stornieren':
break
elif event == 'OK':
print('Wert, den Sie eingegeben haben:', values[0])
window.close()
Lassen Sie uns erklären, während wir tatsächlich Dinge machen.
Der im Artikel "[Automatisierung] Extrahieren von Tabellen in PDF mit Python" eingeführte Code wurde geringfügig geändert und ** "Angegebene Seite der PDF-Datei" Erstellen wir ein Programm, das die darin enthaltene Tabelle extrahiert und mit einer GUI in csv "** konvertiert.
Der Teil, der die Tabelle auf der angegebenen Seite der PDF-Datei mit DataFrame extrahiert, wird zu einer Funktion. Diesmal ist es nicht wichtig, deshalb werde ich die Erklärung weglassen. Weitere Informationen finden Sie unter "[Automatisierung] Tabellen in PDF mit Python extrahieren".
import pandas as pd
import tabula
def readTableFromPDF(filePath, isLattice, targetPages):
'''
Liest eine Tabelle aus einer PDF-Datei mit dem angegebenen Dateipfad und konvertiert sie in DataFramle
'''
dfs = tabula.read_pdf(filePath, lattice=isLattice, pages=targetPages)
#Zeigen Sie den konvertierten DataFrame an
for index, df in enumerate(dfs):
print("----------Tabelle"+str(index+1)+"----------")
print(df.head())
return dfs
Entscheiden Sie zunächst, welche Art von GUI Sie entwerfen möchten. Es kann Papier oder elektronisch sein, also schreibe ich das Design.
Ich dachte an eine solche GUI.
Importieren Sie die PySimple-GUI mit dem Namen "sg".
import PySimpleGUI as sg
Legen Sie das GUI-Designthema mit sg.theme ()
fest.
Es stehen verschiedene Themen zur Verfügung, aber Sie können die Themenliste anzeigen, indem Sie die Funktion sg.theme_previewer ()
aufrufen.
sg.theme_previewer() #Zeigen Sie eine Liste der Designthemen an
Bitte beachten Sie bei der Auswahl auch die offizielle Website. Explosion des Look and Feel-Themas
Hier werde ich es mit dem Thema Dark Teal7 machen.
sg.theme('DarkTeal7')
Betrachten Sie den GUI-Entwurfsvorschlag Zeile für Zeile.
Insgesamt gibt es 6 Zeilen, daher sieht der Code folgendermaßen aus:
layout = [ [1. Zeile Komponente],
[Komponente der zweiten Zeile],
[3. Zeile Komponente],
[Komponente in Zeile 4],
[Komponente in Zeile 5],
[Komponente in Zeile 6] ]
Schauen wir uns nacheinander jede Zeile an.
In der ersten Zeile wird nur der Text angezeigt. Platzieren Sie den Text als "sg.Text (" Text, den Sie anzeigen möchten ")".
[sg.Text('Bitte geben Sie die zu lesende Datei und Seite an')]
In der zweiten Zeile werden die drei Komponenten platziert.
■ Erste Komponente (Text)
Der Text ist der gleiche wie in der ersten Zeile und wird mit sg.Text ()
platziert.
Je nach Layout möchten Sie möglicherweise die Größe der Komponente angeben.
Geben Sie in diesem Fall "sg.Text" ("anzuzeigender Text", size = ("width", "height")) "an.
■ Zweite und dritte Komponente (Dateibrowser-Schaltfläche)
Eine Schaltfläche zum Auswählen einer Datei im Browser. Platzieren Sie es mit sg.FileBrowse ('Text, den Sie auf der Schaltfläche anzeigen möchten')
.
Der Pfad der ausgewählten Datei wird in dem Feld angezeigt, das von sg.Input ()
platziert wird.
Jede Komponente kann mit einem Namen versehen werden, um diese ** Komponente in der Form "key =" name "" zu identifizieren. ** ** ** Wenn ein Ereignis wie "Taste gedrückt" auftritt, müssen Sie identifizieren, welche Taste gedrückt wurde, oder? Geben Sie der Komponente, mit der Sie das Ereignis behandeln möchten, einen Namen, da Sie ihn zu diesem Zeitpunkt benötigen.
Sie müssen den Pfad der Datei später abrufen, geben Sie ihr also einen Namen für "sg.FileBrowse ()".
[sg.Text('Datei', size=(15, 1)), sg.Input(), sg.FileBrowse('Dateiを選択', key='inputFilePath')]
Die dritte Zeile enthält ebenfalls drei Komponenten.
■ Erste Komponente (Text)
Platziere es mit sg.Text ()
.
■ Zweite Komponente (Textfeld) Das Feld für die Texteingabe lautet "sg.InputText ()". Geben Sie dieser Komponente auch einen Namen.
■ Dritte Komponente (Text)
Platziere es mit sg.Text ()
.
Da die Anzahl der Zeichen etwas groß ist, geben Sie 2 für "vertikale Breite" von "Größe = (" Breite "," vertikale Breite ")) an, um sie als zwei Textzeilen anzuzeigen.
sg.Text ('Bitte geben Sie \ n3-10 für mehrere Seiten an', Größe = (30, 2))
[sg.Text('Seite', size=(15, 1)), sg.InputText('', size=(10, 1), key='pages'), sg.Text('複数Seiteのときは\n3-Bitte geben Sie als 10 an', size=(30, 2))]
In der vierten Zeile werden die beiden Komponenten platziert.
■ Erste Komponente (Text)
Platziere es mit sg.Text ()
.
■ Zweite Komponente (Pulldown-Menü) Das Pulldown-Menü lautet "sg.Combo ((" Wert 1 "," Wert 2 ", ...), default_value =" Wert n ")". Geben Sie dieser Komponente auch einen Namen.
[sg.Text('Tischrand', size=(15, 1)),sg.Combo(('Ja', 'Keiner'), default_value="Ja",size=(10, 1), key='lattice')]
In der fünften Zeile werden die beiden Komponenten platziert.
■ Erste und zweite Komponente (Schaltflächen) Platzieren Sie die Schaltfläche mit "sg.Button" ("Text, den Sie auf der Schaltfläche anzeigen möchten"). Ich möchte das Ereignis behandeln, wenn die Taste gedrückt wird, daher benenne ich sie auch mit "key =" name ".
[sg.Button('lesen', key='read'), sg.Button('In CSV speichern', key='save')]
Diese Zeile enthält nur eine Komponente. Die aus der PDF-Datei gelesene Tabelle wird hier zur Bestätigung ausgegeben.
Verwenden Sie sg.Output (size = (" width "," height "))
, um den Text auszugeben.
[sg.Output(size=(80,20))]
Schreiben Sie die Komponenten aus den Zeilen 1 bis 6 zusammen.
layout = [
[sg.Text('Bitte geben Sie die zu lesende Datei und Seite an')],
[sg.Text('Datei', size=(10, 1)), sg.Input(), sg.FileBrowse('Dateiを選択', key='inputFilePath')],
[sg.Text('Seite', size=(10, 1)), sg.InputText('', size=(10, 1), key='pages'), sg.Text('複数Seiteのときは\n3-Bitte geben Sie als 10 an', size=(30, 2))],
[sg.Text('Tischrand', size=(10, 1)),sg.Combo(('Ja', 'Keiner'), default_value="Ja",size=(10, 1), key='lattice')],
[sg.Button('lesen', key='read'), sg.Button('In CSV speichern', key='save')],
[sg.Output(size=(80,20))]
]
Erstellen Sie ein Fenster mit dem in Schritt 3 erstellten Layout. Der Titel des Fensters sollte "Tool zum Extrahieren von PDF-Tabellen" lauten.
window = sg.Window('Tool zum Extrahieren von PDF-Tabellen', layout)
Dies ist der letzte Schritt. Dies ist auch ein sehr wichtiger Schritt.
Warten Sie, bis das Ereignis in der Ereignisschleife auftritt.
Empfangen Sie das Ereignis mit window.read ()
. Wenn das Ereignis empfangen wird, wird die vom Ereignis auszuführende Aktion ausgewählt und ausgeführt.
while True:
event, values = window.read()
if event == sg.WIN_CLOSED: #Was passiert, wenn Sie die X-Taste im Fenster drücken?
break
if event == 'Ereignisname 1':
#Verarbeitung, wenn Ereignisname 1 auftritt
if event == 'Ereignisname 2':
#Verarbeitung, wenn Ereignisname 2 auftritt
window.close()
Der Rückgabewert von window.read (), event, enthält den Namen, der jeder Komponente mit "key =" name "" gegeben wurde. Beispielsweise heißt die Schaltfläche "Lesen" "Lesen". Wenn diese Schaltfläche gedrückt wird, hat das Ereignis den Namen "Lesen".
values enthält die Werte jeder Komponente, die auch durch Angabe des Namens für jede Komponente mit "key =" name "" abgerufen werden können. Zum Beispiel kann der Wert des Pulldown-Menüs ('Ja' oder 'Nein') in der 4. Zeile mit Werten ['Gitter'] erhalten werden.
Diesmal gibt es zwei Arten der Ereignisbehandlung.
Veranstaltung | Veranstaltung名 | Was ist zu tun |
---|---|---|
Die "Lesen" -Taste wurde gedrückt | 'read' | readTableFromPDF()Laufen |
Die Taste "In CSV speichern" wurde gedrückt | 'save' | readTableFromPDF()Speichern Sie den erhaltenen DataFrame als Rückgabewert als csv |
while True:
event, values = window.read()
if event == sg.WIN_CLOSED: #Was passiert, wenn Sie die X-Taste im Fenster drücken?
break
if event == 'read': #Was tun, wenn die Taste "Lesen" gedrückt wird?
if values['lattice'] == 'Ja':
isLattice = True
else:
isLattice = False
readTableFromPDF(values['inputFilePath'], isLattice, values['pages'])
if event == 'save': #Verarbeitung, wenn die Schaltfläche "In CSV speichern" gedrückt wird
if values['lattice'] == 'Ja':
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] #Extrahieren Sie den Namen der PDF-Datei
filename = basename_without_ext + "_" + str(index+1) +".csv"
df.to_csv(filename, index=None)
print("In CSV-Datei gespeichert:", filename)
print("Alle CSV-Dateien wurden gespeichert")
window.close()
Das Ergebnis der print-Anweisung wird hier im Feld "sg.Output ()" angezeigt, das die Komponente in der 6. Zeile darstellt.
Stellen Sie den gesamten Code aus den Schritten 1-5 zusammen.
#Schritt 1.importieren
import PySimpleGUI as sg
import os
#Schritt 2.Design-Themeneinstellung
sg.theme('DarkTeal7')
#Schritt 3.Fensterteile und Layout
layout = [
[sg.Text('Bitte geben Sie die zu lesende Datei und Seite an')],
[sg.Text('Datei', size=(10, 1)), sg.Input(), sg.FileBrowse('Dateiを選択', key='inputFilePath')],
[sg.Text('Seite', size=(10, 1)), sg.InputText('', size=(10, 1), key='pages'), sg.Text('複数Seiteのときは\n3-Bitte geben Sie als 10 an', size=(30, 2))],
[sg.Text('Tischrand', size=(10, 1)),sg.Combo(('Ja', 'Keiner'), default_value="Ja",size=(10, 1), key='lattice')],
[sg.Button('lesen', key='read'), sg.Button('In CSV speichern', key='save')],
[sg.Output(size=(80,20))]
]
#Schritt 4.Fenstergenerierung
window = sg.Window('Tool zum Extrahieren von PDF-Tabellen', layout)
#Schritt 5.Ereignisschleife
while True:
event, values = window.read()
if event == sg.WIN_CLOSED: #Was passiert, wenn Sie die X-Taste im Fenster drücken?
break
if event == 'read': #Was tun, wenn die Taste "Lesen" gedrückt wird?
if values['lattice'] == 'Ja':
isLattice = True
else:
isLattice = False
readTableFromPDF(values['inputFilePath'], isLattice, values['pages'])
if event == 'save': #Verarbeitung, wenn die Schaltfläche "In CSV speichern" gedrückt wird
if values['lattice'] == 'Ja':
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] #Extrahieren Sie den Namen der PDF-Datei
filename = basename_without_ext + "_" + str(index+1) +".csv"
df.to_csv(filename, index=None)
print("In CSV-Datei gespeichert:", filename)
print("Alle CSV-Dateien wurden gespeichert")
window.close()
Wenn Sie den obigen Code ausführen, wird die folgende GUI angezeigt. Es ist fast so wie geplant.
Geben Sie die PDF-Datei und -Seite an und versuchen Sie "Lesen".
Sie können die Seiten in der PDF-Datei richtig lesen!
Wie der Name schon sagt, können Sie mit PySimpleGui einfach GUIs schreiben, sodass ich eine GUI erstellen konnte, während ich Spaß hatte. Die hier vorgestellten Komponenten sind sehr einfach, aber Sie können problemlos verschiedene andere Komponenten erstellen. Leider gibt es nur wenige japanische Dokumente für PySimpleGui, aber ich hoffe, Sie werden Spaß daran haben, eine GUI zu erstellen, während Sie auf die folgende Site verweisen.
PySimpleGui Official Dies ist die offizielle Website von PySimpleGui.
Grundlegende Verwendung der PySimple-Benutzeroberfläche Ich denke, der im Artikel verlinkte Text ist derzeit einer der wenigen japanischen PySimple Gui-Texte. Ich habe es auch als Referenz verwendet.
Recommended Posts