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.
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
-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é.
・ Windows10 ・ Python 3.7.0
Cela ressemble à ceci une fois commencé
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).
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()
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).
#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.
① 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.
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