[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
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
Die Anwendung ist wie folgt.
Die erweiterten Funktionen sind die folgenden vier.
Die Metadaten werden nach dem ** TODO-Namen ** als ** Frist ** oder ** Kategorie ** hinzugefügt.
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
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.
** 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
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.
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.
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
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 [""]
...
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
...
Ü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})
...
...
...
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)
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.