Wenn Sie eine TODO-Anwendung (verteilt) nur mit Python-Extension 1 erstellen möchten

[3]: https://qiita.com/The-town/items/3bc23ea6eef140787ee2 # Verwendung [4]:https://stackoverflow.com/questions/5348454/is-it-possible-to-colour-a-specific-item-in-a-listbox-widget

Zusammenfassung dieses Artikels

Dieser Artikel handelt vom Qiita Summer Festival 2020 "Wenn Sie △△ (App) jetzt nur mit 〇〇 (Sprache) erstellen möchten" In diesem Abschnitt wird die ** Erweiterung ** der ** TODO-Anwendung (verteilt) ** erläutert, die als Thema erstellt wurde.

[Wenn Sie eine TODO-Anwendung (verteilt) jetzt nur mit Python erstellen möchten] Die TODO-Anwendung, die ich in 2 geschrieben habe Ich habe versucht, die Funktion zu erweitern. Ich habe es genossen, es nur für das Qiita-Sommerfestival zu machen, also werde ich es langsam erweitern.

Ich verwende ** Python3 (Version 3.7) ** und habe den Vorgang unter Windows 10 bestätigt.

Der Code befindet sich auf dem GitHub unten. Fühlen Sie sich frei, es zu benutzen.

[Code] 1

Was ist die erweiterte TODO-Anwendung (verteilt)?

Aussehen

Die Anwendung ist wie folgt.

todo_ver2.jpg

Erweiterte Funktionalität

Die erweiterten Funktionen sind die folgenden vier.

Anzeige der in der TODO-Datei beschriebenen Metadaten

Die Metadaten werden nach dem ** TODO-Namen ** als ** Frist ** oder ** Kategorie ** hinzugefügt.

todo_ver2_metadata.png

Wenn Sie ** Metadaten ** anzeigen möchten, schreiben Sie ** # Metadaten 1 Metadaten 2 ** in die erste Zeile der ** TODO ** -Datei.

todo.txt


#2020/7/12 Fix

Details von todo

** Metadaten ** selbst werden von ** config.ini ** verwaltet. ** [Meta_data] ** Teil. Geben Sie nach der Nummer (Seriennummer) den ** Schlüsselnamen ** ein, den Sie als ** Metadaten ** anzeigen möchten.

Wenn diese Einstellungsdatei in der ersten Zeile der ** # 2020/07/29 ** und ** TODO-Datei ** beschrieben ist, wird sie an das entsprechende TODO in der ** TODO-Liste ** gesendet. ** Frist: 29.07.2020 ** wird hinzugefügt.

Wenn Sie die ersten Metadaten nicht benötigen, aber die zweiten Metadaten möchten, möchten Sie nur ** Kategorien ** anzeigen ** # [1 Feld halber Breite] Kategoriename **. Da das Leerzeichen mit halber Breite als Trennzeichen verwendet wird, Geben Sie ** einen Platz mit halber Breite ** für unnötige Metadaten ein.

config.ini


[Dir_names]
django=F:\Document\800_IT selbstlernend\09_python\10_Django
kivy=F:\Document\800_IT selbstlernend\09_python\14_Kivy
qiita=F:\Document\800_IT selbstlernend\09_python\51_Qiita

[File_names]
todo=*todo*.txt

[Meta_data]
1=Frist
2=Kategorie

Sortieren von TODO-Dateien nach Fälligkeitsdatum und Wichtigkeit

Sie können sortieren, indem Sie die Sortiermethode aus dem Pulldown links auswählen und auf die Schaltfläche Aktualisieren klicken.

** Wichtigkeit ** ist die Wichtigkeit und ** Grenze ** ist die Frist.

todo_ver2_sort.png

** Wichtigkeit ** verwendet die ** Wichtigkeit **, die in ** Importance_color ** in der Konfigurationsdatei verwendet wird. Ich denke, es wird einfacher zu verstehen sein, ob ** Wichtigkeit ** im Grunde ** römische Zeichen ** oder ** Zahlen ** wie ** A, B, C ** sind. Sie können hier tun, was Sie wollen, indem Sie die Einstellungsdatei ändern.

config.ini


[Dir_names]
django=F:\Document\800_IT selbstlernend\09_python\10_Django
kivy=F:\Document\800_IT selbstlernend\09_python\14_Kivy
qiita=F:\Document\800_IT selbstlernend\09_python\51_Qiita

[File_names]
todo=*todo*.txt

[Importance_color]
default=white
A=red
B=yellow
C=green

[Meta_data]
1=Frist
2=Kategorie

Farbcodierung nach Wichtigkeit des Namens der TODO-Datei

Dies ist eine Funktion zum Ändern der Farbe der TODO-Liste basierend auf der in der Einstellungsdatei beschriebenen Entsprechung zwischen ** Wichtigkeit ** und ** Farbe **.

Wie oben erläutert, können Sie ** [Importance_color] ** in ** config.ini ** festlegen, um eine beliebige Farbe zu erhalten.

Öffnen Sie den Texteditor, indem Sie im TODO-Detailbildschirm auf den Pfad klicken

Der Dateipfad wird auf dem TODO-Detailbildschirm beschrieben, und Sie können die ** TODO-Datei ** mit dem ** OS-Standardprogramm ** öffnen, indem Sie darauf doppelklicken.

In meiner Umgebung soll **. Txt ** im Sakura-Editor geöffnet sein. Wenn Sie also auf den Dateipfad im TODO-Detailbildschirm klicken, wird der Sakura-Editor geöffnet.

todo_ver2_open_texteditor.png

Wie benutzt man

Details sind in [Last Post Page] [3] beschrieben.

Die aktualisierten Konfigurationsdateien sind ** Importance_color ** und ** Meta_data **.

config.ini


[Dir_names]
#Der im Pulldown angezeigte Name=Absoluter Pfad des Ordners, der die TODO-Datei enthält
#Beispiel
qiita=F:\Document\800_IT selbstlernend\09_python\51_Qiita

[File_names]
#Der Name der Datei, die Sie in der TODO-Liste anzeigen möchten. Platzhalter(*)Sie können verwenden.
#Beispiel

#Dateien mit der Zeichenfolge todo am Anfang
todo=todo*

#Dateien mit py-Erweiterung
python=*.py

[Importance_color]
#Die Farbe, die der Zeichenfolge entspricht, die im Dateinamen verwendet wird, um die Wichtigkeit anzuzeigen
#Standard ist die Farbe, die für Dateien verwendet wird, die keine wichtige Zeichenfolge enthalten.
#Die Farbe wird durch eine Zeichenfolge wie Rot oder Blau angegeben.
default=white
A=red
B=yellow
C=green

[Meta_data]
#Die Position der Zeichenfolge in der Datei, die als Metadaten verwendet werden soll, und der Schlüsselname der Metadaten
#Von der ersten Zeile der TODO-Datei#Erkennen Sie alles, was mit Metadaten beginnt.
# example: #2020/09/01 Frist für das Hinzufügen von Funktionen:2020/09/01 Kategorie:Funktionen werden hinzugefügt.
#          #Kategorie, wenn Funktion hinzugefügt wird:Eine Funktion wird hinzugefügt (die Frist wird ignoriert, da ein Leerzeichen mit halber Breite vorhanden ist).
1=Frist
2=Kategorie

Implementierung

Anzeige der in der TODO-Datei beschriebenen Metadaten

Dadurch wurde einfach die Methode ** search_mata_data ** in der Klasse ** Todo ** implementiert, um eine Liste der zurückgegebenen Metadaten zu erhalten. Die Liste der Metadaten wird mit ** listbox.insert ** angezeigt.

display.py


...
class TodoDisplay:
    def display_todo(self):
        ...
        for path in paths:
            metadata_list = self.todo.search_meta_data(path)
            insert_statement_list = [path.split("\\")[-1].split(".")[0]]
            insert_statement_list.extend(metadata_list)
            insert_statement = " ".join(insert_statement_list)
            self.listbox.insert(todo_list_box_id, insert_statement)
        ...
...

todo.py


class Todo:
    ...

    def search_meta_data(self, path):
        linecache.clearcache()
        first_line = linecache.getline(path, 1)
        if "#" == first_line[0]:
            metadata_list = first_line[1:].split(" ")[:len(self.rule_file["Meta_data"].keys())]
            display_metadata_list = []
            for i, metadata in enumerate(metadata_list):
                if metadata != "":
                    display_metadata_list.append(":".join([self.rule_file["Meta_data"][str(i+1)], metadata]))
            return display_metadata_list
        else:
            return [""]
    ...

Sortieren von TODO-Dateien nach Fälligkeitsdatum und Wichtigkeit

Rufen Sie in der Klasse ** TodoDisplay ** die Methode ** sort_todo ** in der Klasse ** Todo ** auf.

Die von ** combbox (Pulldown) ** ausgewählte Zeichenfolge wird als Argument übergeben, und die aufzurufende Funktion wird entsprechend der von ** sort_todo ** übergebenen Zeichenfolge geändert.

display.py


class TodoDisplay:
    ...
    def display_todo(self):
        ...
        if self.sort_combbox.get() == "":
            pass
        else:
            paths = self.todo.sort_todo(paths, method=self.sort_combbox.get())
        ...
    ...

todo.py


class Todo:
    ...
    def sort_todo(self, paths, method):
        if method == "importance":
            return self.sort_importance(paths)
        elif method == "limit":
            return self.sort_todo_limit(paths)

    def sort_importance(self, paths):
        path_dicts = []
        for path in paths:
            path_dict = {}
            file_name = path.split("\\")[-1].split(".")[0]
            result = self.judge_importance(file_name)
            if result is None:
                path_dict["importance"] = "z"
            else:
                path_dict["importance"] = result.group()[1]
            path_dict["path"] = path
            path_dicts.append(path_dict)

        sorted_path_dicts = sorted(path_dicts, key=lambda x: x["importance"])
        sorted_paths = [sorted_path_dict["path"] for sorted_path_dict in sorted_path_dicts]
        return sorted_paths

    def sort_todo_limit(self, paths):
        path_dicts = []
        for path in paths:
            path_dict = {}
            first_metadata = self.search_meta_data(path)[0]
            if self.rule_file["Meta_data"]["1"] in first_metadata:
                path_dict["metadata_todo_limit"] = first_metadata.split(":")[-1]
            else:
                path_dict["metadata_todo_limit"] = "9999/12/31"
            path_dict["path"] = path
            path_dicts.append(path_dict)

        sorted_path_dicts = sorted(path_dicts, key=lambda x: x["metadata_todo_limit"])
        sorted_paths = [sorted_path_dict["path"] for sorted_path_dict in sorted_path_dicts]
        return sorted_paths
    ...

Farbcodierung nach Wichtigkeit des Namens der TODO-Datei

Übergeben Sie den Dateipfad an die ** search_importance ** -Methode der ** Todo ** -Klasse und lassen Sie sie die entsprechende Farbe zurückgeben. Verwenden Sie dann ** listbox.itemconfig ** zum Ausmalen.

Ich habe auf den folgenden Link verwiesen, um zu erfahren, wie jede Zeile des Listenfelds eingefärbt wird.

[Is it possible to colour a specific item in a Listbox widget?][4]

display.py


class TodoDisplay:
    ...
    def display_todo(self):
        ...
        for path in paths:
            ...
            importance_color = self.todo.search_importance(path.split("\\")[-1].split(".")[0])
            self.listbox.itemconfig(todo_list_box_id, {'bg': importance_color})
            ...
        ...
    ...

Öffnen Sie den Texteditor, indem Sie im TODO-Detailbildschirm auf den Pfad klicken

Mit ** text.tag_bind ** können Sie ** Ereignis ** einer Textzeichenfolge zuordnen. Sie können die Datei ** path ** auch mit dem in ** OS ** festgelegten Standardprogramm öffnen, indem Sie ** os.system ("start" + path) ** festlegen.

gui_object.py


class Listbox(tk.Listbox):
    ...
    def show_detail(self, event=None):
        ...
        self.text = Text(self.master_of_detail_text)
        self.text.tag_config('system_message', background="white", foreground="blue", underline=1)
        self.text.tag_bind("system_message", "<Double-Button-1>", self.open_with_another_app)
        self.text.insert(END, self.get_todo_list()[self.index(ACTIVE)], "system_message")
        ...
    ...
    
    def open_with_another_app(self, event=None):
        path = self.get_todo_list()[self.index(ACTIVE)]
        os.system("start " + path)

Am Ende

Irgendwie macht es Spaß, die Anwendung zu erweitern. Es kann dasselbe sein wie das Erhöhen eines Charakters mit RPG.

Ich hoffe, es von nun an zu nutzen und weiter auszubauen. Es ist an der Zeit, die Benutzeroberfläche solide zu machen.

Recommended Posts

Wenn Sie eine TODO-Anwendung (verteilt) nur mit Python-Extension 1 erstellen möchten
Wenn Sie Word Cloud erstellen möchten.
Wenn Sie eine Windows-App (exe) erstellen möchten, die jetzt nur mit Python verwendet werden kann
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Anfänger haben versucht, eine Cloud-native Webanwendung mit Datastore / GAE zu erstellen
Wenn Sie den Wert mithilfe von Auswahlmöglichkeiten in der Vorlage im Django-Modell anzeigen möchten
Versuchen Sie, mit WebSocket mit Django (Swamp Dragon) eine Todo-Verwaltungssite zu erstellen.
Erstellen Sie eine Shogi-Score-Management-Anwendung mit Django 5 ~ DB-Daten an Vorlage übergeben ~
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Was tun, wenn Sie mit venv keine virtuelle Umgebung erstellen können, obwohl Sie der offiziellen Website von Django folgen?
So erhalten Sie mit einer vielseitigen Methode nur die erforderlichen Daten aus der strukturierten Datengruppe
Ich werde ein Spiel machen, um das Ablegen von Rätseln und Drachen mithilfe von Pygame zu kontrollieren
[Django] Was tun, wenn das zu erstellende Modell viele Felder enthält?
Wenn Sie Datenwissenschaftler werden möchten, beginnen Sie mit Kaggle
Was tun, wenn in Python minus Null angezeigt wird?
Was tun, wenn bei der Pip-Installation ein Unicode-Dekodierungsfehler auftritt?
Wenn Sie einer Variablen in Python einen CSV-Export zuweisen möchten
So speichern Sie einen Teil eines langen Videos mit OpenCV
So erstellen Sie mit Faker eine CSV-Dummy-Datei mit Japanisch
Überprüfen Sie, ob Sie in Python eine Verbindung zu einem TCP-Port herstellen können
Erstellen Sie ein Befehlszeilenprogramm, um mit Python Dollar in Yen umzurechnen
Was tun, wenn bei Verwendung von Python mit der NetBeans-IDE die Warnung "Falsche Python-Plattform" angezeigt wird?