[Python] Erstellen eines Tools, mit dem Python-Dateien mit tkinter & über den Teil, der abgefangen wurde, aufgelistet, ausgewählt und ausgeführt werden können

1. Über diesen Artikel

Auslösen

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.

Annahme

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

[* Die neuesten Tools und der Quellcode werden auf GitHub veröffentlicht (später beschrieben)](am Ende von # 5)

2. Was Sie tun möchten

3. Verwendete Tools / Umgebung

・ Windows10 ・ Python 3.7.0

4. Code und Erklärung erstellt

Aussehen

Es sieht so aus, als es gestartet wurde.

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

Führen Sie die angegebene Python-Datei durch Drücken der Schaltfläche Ausführen aus (dasselbe Verhalten wie beim Doppelklick-Start).

Code

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

Kommentar

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


Der Teil, der erwischt wurde

    #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.

Windows-Verknüpfungsregistrierung

① 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.

5. Am Ende

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

[Python] Erstellen eines Tools, mit dem Python-Dateien mit tkinter & über den Teil, der abgefangen wurde, aufgelistet, ausgewählt und ausgeführt werden können
[Python] Informationen zum Erstellen eines Tools zum Erstellen einer neuen Outlook-E-Mail basierend auf den Daten der JSON-Datei und dem Teil, der abgefangen wurde
Python> Liste> Partitionen = [0] * len (all_filepaths) / Partitionen [: test_set_size] = [1] * Nachdem Sie eine Liste mit test_set_size> 0 erstellt haben, setzen Sie den vorderen Teil auf 1.
[Python] Informationen zum Erstellen eines Tools zum Anzeigen aller Seiten der Website, die in der JSON-Datei registriert sind und auf denen sie abgefangen wurden
Über psd-tools, eine Bibliothek, die psd-Dateien in Python verarbeiten kann
Verstehen Sie die Wahrscheinlichkeiten und Statistiken, die für das Fortschrittsmanagement mit einem Python-Programm verwendet werden können
Artikel, der eine Person sein kann, die den Mechanismus der API versteht und beherrscht (mit Python-Code)
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Lassen Sie uns eine App erstellen, die ähnliche Bilder mit Python und Flask Part1 durchsuchen kann
Lassen Sie uns eine App erstellen, die ähnliche Bilder mit Python und Flask Part2 durchsuchen kann
Liste der Farben, die mit tkinter (Denkmal) eingestellt werden können
Probleme beim Erstellen eines CSV-JSON-Konvertierungstools mit Python
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Sammeln Sie Tweets über "Corona" mit Python und erkennen Sie automatisch Wörter, die aufgrund des Einflusses von "Corona" zu einem heißen Thema geworden sind.
[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.
So starten Sie einen einfachen WEB-Server, der CGI von PHP und Python ausführen kann
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
[Python] Ein Programm, um die Anzahl der Äpfel und Orangen zu ermitteln, die geerntet werden können
Aus einem Buch, das Programmierer lernen können ... (Python): Über das Sortieren
[Python] Kapitel 01-03 Über Python (Schreiben und Ausführen eines Programms mit PyCharm)
Erstellen eines Python-Skripts, das die e-Stat-API unterstützt (Version 2)
So einfach wie möglich eine GUI mit Python erstellen [tkinter edition]
[Python] Zeichnen Sie mit Plotly Höhendaten auf eine sphärische Oberfläche und zeichnen Sie einen Globus, der rund und rund gedreht werden kann
Ich habe die Jumbo-Lotterie zum Jahresende mit Python gekauft und analysiert, die in Colaboratory ausgeführt werden kann
[Python] Eine Funktion, die die gesamte Zeichenfolge mit einem regulären Ausdruck durchsucht und alle übereinstimmenden Zeichenfolgen abruft.
Über die Sache, dass Fackelzusammenfassung wirklich verwendet werden kann, wenn ein Modell mit Pytorch erstellt wird
[Python] Ein Programm, das die maximale Anzahl von Spielzeugen findet, die mit Ihrem Geld gekauft werden können
Die Geschichte des Erstellens eines Bots, der aktive Mitglieder in einem bestimmten Slack-Kanal mit Python anzeigt
Programmieren mit Python und Tkinter
[Python] Erstellen Sie ein Diagramm, das mit Plotly verschoben werden kann
Erstellen Sie eine Spinbox, die mit Tkinter in Binär angezeigt werden kann
Aus einem Buch, das der Programmierer lernen kann ... (Python): Finden Sie den häufigsten Wert
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
Lösen Sie das Python-Rucksackproblem mit der Branch-and-Bound-Methode
Erstellen Sie eine Spinbox, die mit Tkinter in HEX angezeigt werden kann
Bereiten Sie eine verteilte Lasttestumgebung mit dem Python-Lasttest-Tool Locust vor
Ein Python-Skript, das auf dem Mac erstellte ._DS_Store- und ._ * -Dateien löscht
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
Ruft eine Liste der Dateien in einem Ordner mit Python ohne Pfad ab
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
Ein Memo beim Erstellen einer Umgebung, die vorerst mit Lambda @ Edge debuggt werden kann
Finden Sie heraus, wie alt ein Baseballspieler mit Python und Stan eine Heimatbasis erreichen kann
[Python] Code, der zu Beginn beim Scraping als Anfänger mit Hirntod geschrieben werden kann
Rufen Sie eine Liste der Kameraparameter ab, die mit cv2.VideoCapture festgelegt werden können, und machen Sie daraus einen Wörterbuchtyp