[PYTHON] Créer une interface utilisateur qui remplace VBA par PySimpleGUI (sortie de la boîte de dialogue de fichier, liste, journal)

Ce que vous pouvez lire cet article

結果.jpg

Utilisez PySimpleGUI pour obtenir des fichiers et des dossiers à l'aide de boîtes de dialogue, Vous pouvez exécuter le processus à l'aide du fichier acquis et afficher le journal à l'écran.

Aperçu

Il existe des articles et des livres qui utilisent Python comme de-VBA, et des articles qui utilisent OpenPyXl pour manipuler les fichiers Excel. Il y en a, mais la plupart des fichiers sont démarrés par CLI, et je ne vois pas beaucoup d'articles qui fonctionnent avec l'interface graphique. Cette fois, je vais vous expliquer comment utiliser PySimpleGUI pour faire quelque chose d'équivalent à VBA GUI. Pour le fonctionnement de base de PySimpleGUI, reportez-vous à Si vous utilisez Tkinter, essayez d'utiliser PySimpleGUI.

Par exemple, si vous souhaitez lire plusieurs fichiers dans Excel et les combiner en un seul fichier, les opérations et affichages suivants peuvent être nécessaires.

  1. Sélectionnez plusieurs fichiers à charger
  2. Affichez la liste des fichiers sélectionnés
  3. Sélection des options
  4. Exécuter
  5. Enregistrer la sortie des résultats d'exécution

Le code est comme suit. Cette fois, la fonction de l'opération Excel n'est pas répertoriée. Ce n'est que l'explication de la partie GUI.

#Fichier original https://pysimplegui.trinket.io/demo-programs#/examples-for-reddit-posts/visual-basic-mockup

import PySimpleGUI as sg
from os.path import basename

frame1 = [[sg.Radio('Organisez chaque feuille en un seul fichier', 1, key='-MULTI-SHEET-', default=True)],
          [sg.Radio('Combinez en 1 fichier et 1 feuille', 1, key='-ONE-SHEET-')]]

col1 = [[sg.Button('Courir')],
        [sg.Button('Fin')]]


layout = [[sg.Text('Sélection de fichiers', size=(15, 1), justification='right'),
          sg.InputText('Liste des fichiers', enable_events=True,),
          sg.FilesBrowse('Ajouter le fichier', key='-FILES-', file_types=(('fichier Excel', '*.xlsx'),))],
          [sg.Button('Copier le journal'), sg.Button('Effacer le journal')],
          [sg.Output(size=(100, 5), key='-MULTILINE-')],
          [sg.Button('Effacer la liste des entrées')],
          [sg.Listbox([], size=(100, 10), enable_events=True, key='-LIST-')],
          [sg.Frame('Traitement du contenu', frame1), sg.Column(col1)]]

window = sg.Window('Combinaison Excel', layout)

new_files = []
new_file_names = []

while True:             # Event Loop
    event, values = window.read()
    if event in (None, 'Fin'):
        break

    if event == 'Courir':
        print('Exécuter le traitement')
        print('Dossier à traiter:', new_files)

        #Traitement des changements en fonction de la valeur du bouton radio
        if values['-MULTI-SHEET-']:
            print('Combinez plusieurs feuilles en un seul fichier')
        elif values['-ONE-SHEET-']:
            print('Combinez plusieurs feuilles en une seule feuille')

        #Apparaitre
        sg.popup('Le traitement s'est terminé normalement')
    elif event == 'Effacer le journal':
        print('Effacer le journal')
        window.FindElement('-MULTILINE-').Update('')
    elif event == 'Copier le journal':
        window.FindElement('-MULTILINE-').Widget.clipboard_append(window.find_element('-MULTILINE-').Get())
        sg.popup('J'ai copié le journal')
    elif event == 'Effacer la liste des entrées':
        print('Effacer la liste des entrées')

        new_files.clear()
        new_file_names.clear()
        window['-LIST-'].update('')
    elif values['-FILES-'] != '':
        print('FilesBrowse')

        # TODO:Il est nécessaire de déterminer si les fichiers sont les mêmes pour le fonctionnement réel
        new_files.extend(values['-FILES-'].split(';'))
        new_file_names.extend([basename(file_path) for file_path in new_files])

        print('Ajouter le fichier')
        window['-LIST-'].update(new_file_names)  #Afficher dans la zone de liste

window.close()

Vous trouverez ci-dessous une introduction à chaque fonction.

Sélectionnez plusieurs fichiers à charger

Il existe les trois boutons (méthodes) suivants pour spécifier un fichier avec PySimpleGUI.

Sur le plan opérationnel, lorsque vous l'ajoutez à la mise en page, un bouton s'affiche, lorsque vous cliquez dessus, une boîte de dialogue s'affiche et le fichier sélectionné dans la boîte de dialogue s'affiche. Vous pouvez obtenir le fichier sélectionné avec un chemin absolu.

Voici un exemple de code. En outre, ce code a ajouté des fonctions en faisant référence à la [maquette Visual Basic] officielle (https://pysimplegui.trinket.io/demo-programs#/examples-for-reddit-posts/visual-basic-mockup). Je vais.

import PySimpleGUI as sg

sg.InputText('Liste des fichiers',enable_events=True,), sg.FilesBrowse('Ajouter le fichier', key='-FILES-', file_types=(("fichier Excel", "*.xlsx"),))],

Si vous obtenez plusieurs fichiers avec FilesBrowse, la valeur est" Chemin absolu du fichier 1; Chemin absolu du fichier; ". Vous pouvez obtenir le fichier en le divisant avec values ['-FILES-']. Split (';'))

À propos du glisser-déposer

La fonction glisser-déposer n'est pas incluse dans tkinter fourni avec Python en standard. Il semble que vous puissiez le faire en installant vous-même l'extension.

PySimpleGUI est un wrapper pour tkinter, il n'y a donc pas de fonction glisser-déposer. Cependant, si vous regardez la documentation de Python 3.9, vous trouverez la page suivante, donc dans la prochaine version de 3.9 Le glisser-déposer peut être possible avec tkinter fourni avec Python, et des fonctions de glisser-déposer peuvent être ajoutées dans l'interface graphique PySimple.

Mise à jour le 6 février 2020: j'ai été officiellement informé. Il semble que le glisser-déposer de tkinter ne soit compatible qu'avec le glisser-déposer dans l'application. Il a été dit que PySimpleGUIQt prend en charge le glisser-déposer d'Explorateur.

# Afficher la liste des fichiers sélectionnés Pour lister les fichiers sélectionnés, utilisez cette fois la zone de liste pour les afficher. Dans PySimpleGUI, il est affiché en utilisant `Listbox ()`.
[sg.Listbox([], size=(100, 10), enable_events=True, key='-LIST-')],

Pour rendre le contenu entré dans une zone de liste, utilisez la méthode ʻupdate () de la classe window` pour mettre à jour.

window['-LIST-'].update(new_file_names)  #Afficher dans la zone de liste

Sélection d'options

La sélection d'option est implémentée à l'aide du bouton radio.

frame1 = [[sg.Radio('Organisez chaque feuille en un seul fichier',1, key='-MULTI-SHEET-', default=True)],
          [sg.Radio('Combinez en 1 fichier et 1 feuille', 1, key='-ONE-SHEET-')]]

La valeur du bouton radio sélectionnée au moment de l'exécution est déterminée par le fait que la valeur définie dans «key» est «True».

if values['-MULTI-SHEET-']:
    print('Combinez plusieurs feuilles en un seul fichier')
elif values['-ONE-SHEET-']:
    print('Combinez plusieurs feuilles en une seule feuille')

Sortie de journal des résultats d'exécution

Utilisez l'élément ʻOutput () pour afficher l'exécution à l'écran. Si cela est placé, le contenu décrit par print ()` sera affiché.

[sg.Output(size=(100,5), key='-MULTILINE-'),],

Copier dans le clip

Clipstick utilise la méthode suivante de tkinter

Cette fois, utilisez clipboard_append pour copier la valeur de sortie du journal dans ʻOutput ()`.

window.FindElement('-MULTILINE-').Widget.clipboard_append( window.FindElement('-MULTILINE-').Get())

Résumé

J'ai présenté comment créer une interface graphique équivalente à VBA avec PySimpleGUI. Ouvrez une boîte de dialogue et sélectionnez un fichier. Je pense que l'interface graphique permettant de traiter le fichier sélectionné est utile.

Recommended Posts

Créer une interface utilisateur qui remplace VBA par PySimpleGUI (sortie de la boîte de dialogue de fichier, liste, journal)
Créer un cylindre avec une sortie de fichier open3d + STL
Créer un téléchargeur de fichiers avec Django
Créer un gros fichier texte avec shellscript
Créer une machine virtuelle avec un fichier YAML (KVM)
Créer un fichier exécutable GUI créé avec tkinter
Créez une interface utilisateur de jeu à partir de zéro avec pygame2!
Créer un fichier PDF avec une taille de page aléatoire
Créer une page qui se charge indéfiniment avec python
Créer un fichier au format Photoshop (.psd) avec python
Ouvrir la boîte de dialogue de fichier avec l'interface graphique Python (tkinter.filedialog)
Créez un fichier exe qui fonctionne dans un environnement Windows sans Python avec PyInstaller
Créez un chatbot prenant en charge la saisie gratuite avec Word2Vec
Créer une application Todo avec Django ③ Créer une page de liste de tâches
[Python] Créez un fichier de distribution pour le programme Tkinter avec cx_Freeze
Créer un fichier CAO 2D ".dxf" avec python [ezdxf]
Créez une application Web qui reconnaît les nombres avec un réseau neuronal
Créez une PythonBox qui sort avec Random après l'entrée PEPPER
[Python] Créez un écran de spécification de chemin de fichier et de dossier avec tkinter
Créons un script qui s'enregistre avec Ideone.com en Python.
Créez un jeu de vie mis à jour manuellement avec tkinter
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
Créez une API Web capable de fournir des images avec Django