Sie können auch mit Python problemlos eine GUI erstellen

Sogar Python möchte eine GUI erstellen

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 **

pysimplegui_sample.png

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.

Vorbereitung (Installation)

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

Code

Schritt 1. Importieren

Importieren Sie die PySimple-GUI. Derzeit ist es Standard, einen Alias von "sg" anzugeben, daher folgt dieser Artikel dieser Konvention.


import PySimpleGUI as sg

Schritt 2. Legen Sie das Designthema fest

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

Schritt 3. Fensterteile und Layout

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,] ]

Schritt 4. Erstellen Sie ein Fenster

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)

Schritt 5. Ereignisschleife

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

Versuchen Sie, eine GUI zu erstellen

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

Vorbereitung (GUI-Design)

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.

gui_design.png

Schritt 1. Importieren

Importieren Sie die PySimple-GUI mit dem Namen "sg".


import PySimpleGUI as sg

Schritt 2. Legen Sie das Designthema fest

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

Schritt 3. Fensterteile und Layout

Betrachten Sie den GUI-Entwurfsvorschlag Zeile für Zeile. gui_design1.png

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.

Die erste Zeile

gui_design_row1.png

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')]

2. Zeile

gui_design_row2.png

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')]

3. Zeile

gui_design_row3.png

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

4. Zeile

gui_design_row4.png

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')]

5. Zeile

gui_design_row5.png

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')]

6. Zeile

gui_design_row6.png

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

Komponentenübersicht

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

Schritt 4. Erstellen Sie ein Fenster

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)

Schritt 5. Ereignisschleife

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.

Zusammenfassung des bisherigen GUI-Codes

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

GUI abgeschlossen

Wenn Sie den obigen Code ausführen, wird die folgende GUI angezeigt. Es ist fast so wie geplant.

gui_pdfreader1.png

Geben Sie die PDF-Datei und -Seite an und versuchen Sie "Lesen".

gui_pdfreader2.png

Sie können die Seiten in der PDF-Datei richtig lesen!

Immerhin muss GUI Spaß machen

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

Sie können auch mit Python problemlos eine GUI erstellen
Erstellen Sie einfach eine Python-Konsolenanwendung mit Click
Erstellen Sie ein Verzeichnis mit Python
Erstellen Sie mit tkinter eine Python-GUI
Erstellen Sie eine virtuelle Umgebung mit Python!
Python | Was Sie mit Python machen können
So einfach wie möglich eine GUI mit Python erstellen [tkinter edition]
Erstellen Sie mit Class einen Python-Funktionsdekorator
Erstellen Sie mit Python + PIL ein Dummy-Image.
Erstellen Sie eine einfache GUI-App in Python
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Erstellen wir mit Python eine kostenlose Gruppe
Erstellen Sie eine GUI-App mit Tkinter of Python
Erstellen Sie mit Python 3.4 einen Worthäufigkeitszähler
Bis Sie opencv mit Python verwenden können
Erstellen Sie mit tkinter [Python] einen Rahmen mit transparentem Hintergrund.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Erstellen Sie ein Python-Modul
Erstellen Sie eine mit tkinter erstellte ausführbare GUI-Datei
Erstellen Sie mit Minette für Python einen LINE BOT
Erstellen Sie eine Web-App, die mit Plotly Dash einfach visualisiert werden kann
Erstellen Sie eine virtuelle Umgebung mit conda in Python
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
Erstellen Sie mit Sublime Text3 eine Python3-Build-Umgebung
Erstellen Sie eine Farbleiste mit Python + Qt (PySide)
Schritte zum Erstellen eines Twitter-Bots mit Python
Machen Sie einfach einen Piepton mit Python
Erstellen Sie mit Python einen Entscheidungsbaum von 0 (1. Übersicht)
Erstellen Sie eine neue Seite im Zusammenfluss mit Python
Erstellen Sie mit Python + Qt (PySide) ein farbspezifisches Widget.
Erstellen Sie mit Python eine Datei im Photoshop-Format (.psd)
Erstellen Sie eine Python-Umgebung
Dateidialog mit Python-GUI öffnen (tkinter.filedialog)
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Ich habe versucht, mit Selenium + Python einfach ein vollautomatisches Anwesenheitssystem zu erstellen
Erstellen Sie mit Py2app und Tkinter eine native GUI-App
[Python] Generieren Sie ValueObject mit dem vollständigen Konstruktor mithilfe von Datenklassen
Erstellen Sie eine Python-Entwicklungsumgebung mit Vagrant + Ansible + Fabric
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
[Python] Erstellen Sie mit np.arange ein Datumsarray mit beliebigen Inkrementen
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
[Python] Erstellen Sie mit cx_Freeze eine Verteilungsdatei für das Tkinter-Programm
Erstellen Sie mit Quarry einen gefälschten Minecraft-Server in Python
Erstellen Sie eine 2D-CAD-Datei ".dxf" mit Python [ezdxf]
Mit Python mit Kelch ganz einfach ohne Server
Erstellen Sie ein Wörterbuch in Python
Erstellen Sie ein 3D-GIF mit Python3
Erstellen Sie eine Homepage mit Django
[GUI in Python] PyQt5-Layout-Management-
Erstellen Sie ein Python-Numpy-Array
Machen Sie eine Lotterie mit Python
[GUI mit Python] PyQt5-Vorbereitung-
Einfach cProfile mit einem Dekorateur
[GUI mit Python] PyQt5 -Paint-
Überlegen Sie, wann Sie mit Python3 und Scala3 in 10 Jahren gute Arbeit leisten können.
Bis Sie mit Python unter Windows 7 eine maschinelle Lernumgebung erstellen und ausführen