[Python] Création d'un outil qui peut lister, sélectionner et exécuter des fichiers python avec tkinter et à propos de la partie qui a été interceptée

1. À propos de cet article

Déclencheur

J'ai récemment fait quelques outils implémentés en python. Puisqu'il est désormais possible de démarrer depuis la console ou de double-cliquer Je voulais le définir comme un raccourci Windows (décrit plus tard) afin qu'il puisse être démarré facilement (je prévois de créer bientôt un outil de grattage, afin de s'y préparer).

Cependant, si vous définissez un raccourci pour chaque fichier avec l'extension py, cela peut provoquer des battements et un démarrage par inadvertance. J'ai décidé de créer un outil GUI qui peut être exécuté en listant les fichiers python sous le dossier défini et en les sélectionnant.

J'ai entendu dire qu'il existe une bibliothèque pratique appelée tkinter pour créer une interface graphique pour python, je vais donc l'utiliser.

supposition

Un fichier avec l'extension py ou pyw est associé à python.exe (ou pythonw.exe). Qu'est-ce qu'une association? → http://www.first-pclife.com/pckiso/kanrenduketoha.html

[* Les derniers outils et le code source sont publiés sur GitHub (décrit plus loin)](à la fin de # 5)

2. Ce que vous voulez faire

-Recherchez récursivement les fichiers python dans le dossier spécifié et stockez-les dans un type de données tel qu'une liste. -Créer une interface graphique qui répertorie et affiche les données dans un tableau -Implémenter une fonction qui exécute le fichier sélectionné dans le tableau -Définissez l'outil avec les conditions ci-dessus comme raccourci Windows afin qu'il puisse être démarré.

3. Outils / environnement utilisés

・ Windows10 ・ Python 3.7.0

4. Code créé et explication

apparence

Cela ressemble à ceci une fois commencé

Pythonプログラム実行アシスト 2020_01_02 9_18_02 - コピー.png

Exécutez le fichier python spécifié en appuyant sur le bouton d'exécution (même comportement que le double-clic au démarrage).

code

CallPythonFile.py


import glob
import os
import subprocess
import tkinter as tk
import tkinter.ttk as ttk


def main():
    #Créer un cadre racine
    root = tk.Tk()
    root.title(u"Aide à l'exécution de programme Python")
    #Réglage de la taille de la fenêtre racine
    root.geometry("1200x500")

    #Définir le fichier Python sélectionnable comme valeur de dictionnaire
    #Tous les fichiers python directement dans le dossier spécifié (recherche récursive)
    myPath = r'C:\Users\UserName\Test\ToolBox'
    myDic = {}
    if os.path.isdir(myPath):
        for file in glob.glob(myPath + '\\**', recursive=True):
            nameRoot, ext = os.path.splitext(os.path.basename(file))
            if os.path.isfile(file) and ext in ('.py', '.pyw') and nameRoot != '__init__':
                myDic[os.path.abspath(file)] = os.path.basename(file)

    #Réglage du cadre
    frame1 = ttk.Frame(root, width=1200, height=300, padding=10)
    frame1.grid()
    frame1.columnconfigure(0, weight=1)
    frame1.grid_propagate(False)

    # //////Paramètres de l'arborescence
    tree = ttk.Treeview(frame1, height=8, selectmode="browse")

    #Créer un index de colonne
    tree["columns"] = (1, 2)

    #Paramètres de style de tableau
    tree["show"] = "headings"

    #Paramètres pour chaque colonne
    tree.column(1, width=250)
    tree.column(2, width=1000)

    #Paramètre d'en-tête pour chaque colonne
    tree.heading(1, text="nom de fichier")
    tree.heading(2, text="chemin")

    #Créer un enregistrement
    for k, v in sorted(myDic.items(), key=lambda x: x[1]):
        tree.insert("", "end", values=(str(v), str(k)))

    #Disposition de l'arborescence
    tree.grid(row=0, column=0, columnspan=2, padx=5, pady=5, sticky=tk.N + tk.S + tk.E + tk.W)
    # //////////////////////

    #Paramètres de la barre de défilement
    hscrollbar = ttk.Scrollbar(frame1, orient=tk.HORIZONTAL, command=tree.xview)
    vscrollbar = ttk.Scrollbar(frame1, orient=tk.VERTICAL, command=tree.yview)
    tree.configure(xscrollcommand=hscrollbar.set)
    tree.configure(yscrollcommand=vscrollbar.set)
    vscrollbar.grid(row=0, column=1, columnspan=1, padx=5, pady=5, sticky=tk.NS)
    hscrollbar.grid(row=1, column=0, columnspan=1, padx=5, pady=5, sticky=tk.EW)

    #Créer un bouton
    button = tk.Button(text="Courir", command=lambda: RunPythonFile(root, tree))
    #Placement des boutons
    button.grid(padx=5, pady=5, )

    root.mainloop()


def RunPythonFile(root, tree):
    #Obtenez le chemin du fichier sélectionné dans le tableau
    selectedItems = tree.selection()
    filePath = tree.item(selectedItems[0])['values'][1]

    #Fermeture du cadre
    root.destroy()

    #exécution d'appel de fichier py
    subprocess.check_call(['python', filePath])


if __name__ == '__main__':
    main()

Commentaire

for file in glob.glob(myPath + '\\**', recursive=True):

La recherche récursive peut être implémentée assez facilement en utilisant la méthode glob. Lors de son utilisation, ajoutez ** au chemin du dossier parent et définissez récursif sur true.

if os.path.isfile(file) and ext in ('.py', '.pyw') and nameRoot != '__init__':

À l'exclusion des dossiers, seuls ceux avec l'extension py ou pyw sont extraits. Je n'ai pas besoin de init.py, je vais donc le supprimer.

tree = ttk.Treeview(frame1, height=8, selectmode="browse")

C'est un objet enfant de l'objet frame afin de coopérer avec la barre de défilement. La configuration de selectmode = "parcourir" est pratique car vous ne pouvez sélectionner qu'un seul élément de la table créée.


    for k, v in sorted(myDic.items(), key=lambda x: x[1]):
        tree.insert("", "end", values=(str(v), str(k)))

Boucle à travers le tri croissant de valeur (la valeur de retour est une liste) L'article est en cours de retrait. Je l'ai utilisé comme référence. https://qiita.com/shizuma/items/40f1fe4702608db40ac3


button = tk.Button(text="Courir", command=lambda: RunPythonFile(root, tree))

Si vous ne mordez pas la fonction anonyme lambda (lorsque vous spécifiez la fonction directement dans la commande), la fonction sera exécutée lorsque l'interface graphique est affichée, elle est donc NG.


filePath = tree.item(selectedItems[0])['values'][1]

Tous les éléments sélectionnés Le premier élément de selectedItems est l'élément réellement sélectionné. S'il y a plusieurs sélections, il y en aura plus de [1], mais comme select mode = "parcourir" est défini, un seul. ['values'] [1] extrait le chemin du fichier de la liste de valeurs (nom du fichier et chemin du fichier).


La partie qui s'est fait prendre

    #Paramètres de la barre de défilement
    hscrollbar = ttk.Scrollbar(frame1, orient=tk.HORIZONTAL, command=tree.xview)
    vscrollbar = ttk.Scrollbar(frame1, orient=tk.VERTICAL, command=tree.yview)
    tree.configure(xscrollcommand=hscrollbar.set)
    tree.configure(yscrollcommand=vscrollbar.set)
    vscrollbar.grid(row=0, column=1, columnspan=1, padx=5, pady=5, sticky=tk.NS)
    hscrollbar.grid(row=1, column=0, columnspan=1, padx=5, pady=5, sticky=tk.EW)

Le réglage de la barre de défilement était assez difficile. Au début, j'ai utilisé la méthode pack () pour placer chaque composant, Cela ne fonctionne tout simplement pas.

Ensuite, j'ai essayé la méthode gird (). Cependant, après tout cela se décale (même si le défilement de l'axe des x fonctionne bien, l'axe des y ne peut pas être fait. → L'axe des y a fonctionné, mais l'axe des x ...)

Enfin, j'ai trouvé l'article suivant. [Python 3.x --python ttk treeview ne change pas la couleur d'arrière-plan | teratail](https://ja.stackoverflow.com/questions/56104/treeview%E5%86%85%E3%83%AA%E3% 82% B9% E3% 83% 88% E3% 82% 92% E5% 9B% BA% E5% AE% 9A% E5% B9% 85% E3% 81% AB% E3% 81% 97-% E6% A8 % AA% E3% 82% B9% E3% 82% AF% E3% 83% AD% E3% 83% BC% E3% 83% AB% E3% 83% 90% E3% 83% BC% E3% 82% 92 % E6% 9C% 89% E5% 8A% B9% E3% 81% AB% E3% 81% 97% E3% 81% 9F% E3% 81% 84)

J'en ai parlé et j'ai réussi à le mettre en œuvre comme suit et cela a fonctionné.

    #Réglage du cadre
    frame1 = ttk.Frame(root, width=1200, height=300, padding=10)
    frame1.grid()
    frame1.columnconfigure(0, weight=1)
    frame1.grid_propagate(False)

Si quelqu'un sait comment bien l'implémenter avec la méthode pack, merci de me le faire savoir.

enregistrement des raccourcis Windows

① Stockez le raccourci de CallPythonFile.py dans le dossier suivant

C:\ProgramData\Microsoft\Windows\Start Menu\Programs

② Faites un clic droit sur le raccourci et Spécifiez votre clé préférée dans l'élément "Touche de raccourci".

③ Appuyez sur la touche et vérifiez que l'interface graphique est affichée.

5. À la fin

Cliquez ici pour les derniers outils et le code source ↓ https://github.com/dede-20191130/CreateToolAndTest/tree/master/Tool_Python/CallPythonFile

Veuillez commenter si vous avez des suppléments.

Recommended Posts

[Python] Création d'un outil qui peut lister, sélectionner et exécuter des fichiers python avec tkinter et à propos de la partie qui a été interceptée
[Python] À propos de la création d'un outil pour créer un nouveau courrier Outlook basé sur les données du fichier JSON et de la partie qui a été interceptée
Python> Liste> partitions = [0] * len (all_filepaths) / partitions [: test_set_size] = [1] * Après avoir créé une liste avec test_set_size> 0, définissez la partie avant sur 1.
[Python] À propos de la création d'un outil pour afficher toutes les pages du site Web enregistrées dans le fichier JSON et où il a été pris
À propos de psd-tools, une bibliothèque capable de traiter des fichiers psd en Python
Comprendre les probabilités et les statistiques qui peuvent être utilisées pour la gestion des progrès avec un programme python
Article qui peut être une ressource humaine qui comprend et maîtrise le mécanisme de l'API (avec du code Python)
Comment obtenir une liste de fichiers dans le même répertoire avec python
[Python] Récupérez les fichiers dans le dossier avec Python
Créons une application capable de rechercher des images similaires avec Python et Flask Part1
Créons une application capable de rechercher des images similaires avec Python et Flask Part2
Liste des couleurs pouvant être définies avec tkinter (mémorial)
Problèmes lors de la création d'un outil de conversion csv-json avec python
Un mémo que j'ai touché au magasin de données avec python
Recueillez des tweets sur "Corona" avec python et détectez automatiquement les mots qui sont devenus un sujet brûlant en raison de l'influence de "Corona"
[C / C ++] Passez la valeur calculée en C / C ++ à une fonction python pour exécuter le processus et utilisez cette valeur en C / C ++.
Comment démarrer un serveur WEB simple qui peut exécuter des cgi de php et python
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
[Python] Un programme pour trouver le nombre de pommes et d'oranges qui peuvent être récoltées
À partir d'un livre que les programmeurs peuvent apprendre ... (Python): À propos du tri
[Python] Chapitre 01-03 À propos de Python (Ecrire et exécuter un programme à l'aide de PyCharm)
Création d'un script Python prenant en charge l'API e-Stat (ver.2)
Créer une interface graphique aussi facilement que possible avec python [édition tkinter]
[Python] Dessinez des données d'altitude sur une surface sphérique avec Plotly et dessinez un globe qui peut être tourné en rond et en rond
J'ai acheté et analysé la loterie jumbo de fin d'année avec Python qui peut être exécutée dans Colaboratory
[Python] Une fonction qui recherche la chaîne de caractères entière avec une expression régulière et obtient toutes les chaînes de caractères correspondantes.
À propos du fait que le résumé de la torche peut être vraiment utilisé lors de la construction d'un modèle avec Pytorch
[Python] Un programme qui trouve le nombre maximum de jouets pouvant être achetés avec votre argent
L'histoire de la création d'un Bot qui affiche les membres actifs dans un canal spécifique de Slack avec Python
Programmation avec Python et Tkinter
[Python] Créez un graphique qui peut être déplacé avec Plotly
Créez une Spinbox qui peut être affichée en binaire avec Tkinter
À partir d'un livre que le programmeur peut apprendre ... (Python): trouver la valeur la plus fréquente
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
Résolvez le problème du sac à dos Python avec la méthode de branche et liée
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
Préparez un environnement de test de charge distribué avec l'outil de test de charge Python Locust
Un script python qui supprime les fichiers ._DS_Store et ._ * créés sur Mac
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
Obtenez une liste de fichiers dans un dossier avec python sans chemin
L'histoire de la création d'un module qui ignore le courrier avec python
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
Un mémo lors de la création d'un environnement qui peut être débogué avec Lambda @ Edge pour le moment
Découvrez à quel âge un joueur de baseball peut frapper une base avec Python et Stan
[Python] Code qui peut être écrit avec la mort cérébrale au début lors du scraping en tant que débutant
Obtenez une liste des paramètres de caméra qui peuvent être définis avec cv2.VideoCapture et faites-en un type de dictionnaire