Ich habe kürzlich einige Tools in Python implementiert. Da ist es jetzt möglich, von der Konsole aus zu starten oder zu doppelklicken Ich wollte es als Windows-Verknüpfung festlegen (später beschrieben), damit es bequem gestartet werden kann (ich plane, bald ein Scraping-Tool zu erstellen, um mich darauf vorzubereiten).
Wenn Sie jedoch für jede Datei mit der Erweiterung py eine Verknüpfung festlegen, kann dies zu Wimper und versehentlichem Start führen. Ich habe beschlossen, ein GUI-Tool zu erstellen, das ausgeführt werden kann, indem die Python-Dateien unter dem festgelegten Ordner aufgelistet und aus ihnen ausgewählt werden.
Ich habe gehört, dass es eine praktische Bibliothek namens tkinter zum Erstellen einer Python-GUI gibt, also werde ich sie verwenden.
Eine Datei mit der Erweiterung py oder pyw ist python.exe (oder pythonw.exe) zugeordnet. Was ist ein Verein? → http://www.first-pclife.com/pckiso/kanrenduketoha.html
・ Windows10 ・ Python 3.7.0
Es sieht so aus, als es gestartet wurde.
Führen Sie die angegebene Python-Datei durch Drücken der Schaltfläche Ausführen aus (dasselbe Verhalten wie beim Doppelklick-Start).
CallPythonFile.py
import glob
import os
import subprocess
import tkinter as tk
import tkinter.ttk as ttk
def main():
#Erstellen eines Stammrahmens
root = tk.Tk()
root.title(u"Ausführungshilfe für Python-Programme")
#Einstellung der Größe des Stammfensters
root.geometry("1200x500")
#Legen Sie eine auswählbare Python-Datei als Wörterbuchwert fest
#Alle Python-Dateien direkt unter dem angegebenen Ordner (rekursiv suchen)
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)
#Rahmeneinstellung
frame1 = ttk.Frame(root, width=1200, height=300, padding=10)
frame1.grid()
frame1.columnconfigure(0, weight=1)
frame1.grid_propagate(False)
# //////Einstellungen für die Baumansicht
tree = ttk.Treeview(frame1, height=8, selectmode="browse")
#Spaltenindex erstellen
tree["columns"] = (1, 2)
#Einstellungen für den Tabellenstil
tree["show"] = "headings"
#Einstellungen für jede Spalte
tree.column(1, width=250)
tree.column(2, width=1000)
#Kopfzeileneinstellung für jede Spalte
tree.heading(1, text="Dateiname")
tree.heading(2, text="Pfad")
#Datensatz erstellen
for k, v in sorted(myDic.items(), key=lambda x: x[1]):
tree.insert("", "end", values=(str(v), str(k)))
#Anordnung der Baumansicht
tree.grid(row=0, column=0, columnspan=2, padx=5, pady=5, sticky=tk.N + tk.S + tk.E + tk.W)
# //////////////////////
#Bildlaufleisteneinstellungen
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)
#Eine Schaltfläche erstellen
button = tk.Button(text="Lauf", command=lambda: RunPythonFile(root, tree))
#Platzierung der Tasten
button.grid(padx=5, pady=5, )
root.mainloop()
def RunPythonFile(root, tree):
#Holen Sie sich den ausgewählten Dateipfad aus der Tabelle
selectedItems = tree.selection()
filePath = tree.item(selectedItems[0])['values'][1]
#Rahmen schließen
root.destroy()
#Ausführung des py-Dateiaufrufs
subprocess.check_call(['python', filePath])
if __name__ == '__main__':
main()
for file in glob.glob(myPath + '\\**', recursive=True):
Die rekursive Suche kann mit der glob-Methode ganz einfach implementiert werden.
Fügen Sie bei Verwendung ** zum Pfad des übergeordneten Ordners hinzu und setzen Sie rekursiv auf true.
if os.path.isfile(file) and ext in ('.py', '.pyw') and nameRoot != '__init__':
Mit Ausnahme von Ordnern werden nur diejenigen mit der Erweiterung py oder pyw extrahiert.
Ich brauche init.py nicht, also werde ich es entfernen.
tree = ttk.Treeview(frame1, height=8, selectmode="browse")
Es ist ein untergeordnetes Objekt des Rahmenobjekts, um mit der Bildlaufleiste zusammenzuarbeiten. Das Setzen von selectmode = "durchsuchen" ist praktisch, da Sie nur ein Element aus der erstellten Tabelle auswählen können.
for k, v in sorted(myDic.items(), key=lambda x: x[1]):
tree.insert("", "end", values=(str(v), str(k)))
Durchlaufen Sie die aufsteigende Art von Wert (Rückgabewert ist Liste) Der Gegenstand wird herausgenommen. Ich habe dies als Referenz verwendet. https://qiita.com/shizuma/items/40f1fe4702608db40ac3
button = tk.Button(text="Lauf", command=lambda: RunPythonFile(root, tree))
Wenn Sie die anonyme Funktion Lambda nicht beißen (wenn Sie die Funktion direkt im Befehl angeben), wird die Funktion ausgeführt, wenn die GUI angezeigt wird, also NG.
filePath = tree.item(selectedItems[0])['values'][1]
Alle ausgewählten Elemente Das erste Element in selectedItems ist das tatsächlich ausgewählte Element. Wenn es mehrere Auswahlen gibt, gibt es mehr als [1], aber da Auswahlmodus = "Durchsuchen" eingestellt ist, nur eine. ['Werte'] [1] extrahiert den Dateipfad aus der Werteliste (Dateiname und Dateipfad).
#Bildlaufleisteneinstellungen
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)
Das Einstellen der Bildlaufleiste war ziemlich schwierig. Zuerst habe ich die pack () -Methode verwendet, um jede Komponente zu platzieren. Das funktioniert einfach nicht.
Dann habe ich die gird () -Methode ausprobiert. Immerhin verschiebt es sich (selbst wenn der x-Achsen-Bildlauf gut funktioniert, kann die y-Achse nicht ausgeführt werden. → Die y-Achse hat funktioniert, aber die x-Achse ...)
Schließlich fand ich den folgenden Artikel. [Python 3.x --python ttk treeview ändert die Hintergrundfarbe nicht | 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)
Ich habe darauf hingewiesen und es geschafft, es wie folgt zu implementieren, und es hat funktioniert.
#Rahmeneinstellung
frame1 = ttk.Frame(root, width=1200, height=300, padding=10)
frame1.grid()
frame1.columnconfigure(0, weight=1)
frame1.grid_propagate(False)
Wenn jemand weiß, wie man es mit der Pack-Methode gut implementiert, lass es mich wissen.
① Speichern Sie die Verknüpfung von CallPythonFile.py im folgenden Ordner
C:\ProgramData\Microsoft\Windows\Start Menu\Programs
② Klicken Sie mit der rechten Maustaste auf die Verknüpfung und Geben Sie Ihre Lieblingstaste im Element "Tastenkombination" an.
③ Drücken Sie die Taste und überprüfen Sie, ob die GUI angezeigt wird.
Klicken Sie hier für die neuesten Tools und den Quellcode ↓ https://github.com/dede-20191130/CreateToolAndTest/tree/master/Tool_Python/CallPythonFile
Bitte kommentieren Sie, wenn Sie Ergänzungen haben.
Recommended Posts