[3]: https://qiita.com/The-town/items/3bc23ea6eef140787ee2 # Comment utiliser [4]:https://stackoverflow.com/questions/5348454/is-it-possible-to-colour-a-specific-item-in-a-listbox-widget
Cet article concerne Qiita Summer Festival 2020 "Si vous souhaitez créer une △△ (application) en utilisant uniquement 〇〇 (langue)" Cette section explique ** l'extension ** de l'application ** TODO (distribuée) ** créée sous forme de thème.
[Si vous voulez créer une application TODO (distribuée) maintenant en utilisant uniquement Python] L'application TODO que j'ai écrite dans 2 J'ai essayé d'étendre la fonction. J'ai aimé le faire juste pour le festival d'été de Qiita, alors je vais lentement l'étendre.
J'utilise ** Python3 (ver 3.7) ** et j'ai confirmé l'opération sous Windows 10.
Le code se trouve sur le GitHub ci-dessous. Sentez-vous libre de l'utiliser.
[Code] 1
L'application est la suivante.
Les fonctions étendues sont les quatre suivantes.
Les métadonnées sont ajoutées après le ** nom TODO ** en tant que ** date limite ** ou ** catégorie **.
Si vous souhaitez afficher des ** métadonnées **, écrivez ** # metadata 1 metadata 2 ** sur la première ligne du fichier ** TODO **.
todo.txt
#2020/7/12 Correction
détails de todo
** Les métadonnées ** elles-mêmes sont gérées par ** config.ini **. ** [Meta_data] ** partie. Après le numéro (numéro de série), entrez le ** nom de la clé ** que vous souhaitez afficher en tant que ** métadonnées **.
Si ce fichier de paramétrage est décrit dans la première ligne du ** # 2020/07/29 ** et du ** fichier TODO **, il ira au TODO correspondant dans la ** liste TODO **. ** Date limite: 29/07/2020 ** sera ajouté.
Si vous n'avez pas besoin des premières métadonnées mais que vous voulez les secondes métadonnées, c'est-à-dire que vous souhaitez afficher uniquement les ** catégories ** ** # [1 espace demi-largeur] Nom de la catégorie **. Comme les caractères d'espacement demi-largeur sont utilisés comme délimiteurs, Saisissez ** un espace demi-largeur ** pour les métadonnées inutiles.
config.ini
[Dir_names]
django=F:\Document\800_Auto-apprentissage informatique\09_python\10_Django
kivy=F:\Document\800_Auto-apprentissage informatique\09_python\14_Kivy
qiita=F:\Document\800_Auto-apprentissage informatique\09_python\51_Qiita
[File_names]
todo=*todo*.txt
[Meta_data]
1=Date limite
2=Catégorie
Vous pouvez trier en sélectionnant la méthode de tri dans le menu déroulant à gauche et en appuyant sur le bouton de mise à jour.
** importance ** est l'importance et ** limite ** est la date limite.
** importance ** utilise ** importance ** utilisée dans ** Importance_color ** dans le fichier de configuration. Je pense qu'il sera plus facile de comprendre si ** importance ** est essentiellement ** caractères romains ** ou ** nombres ** tels que ** A, B, C **. Vous pouvez faire ce que vous voulez ici en modifiant le fichier de paramètres.
config.ini
[Dir_names]
django=F:\Document\800_Auto-apprentissage informatique\09_python\10_Django
kivy=F:\Document\800_Auto-apprentissage informatique\09_python\14_Kivy
qiita=F:\Document\800_Auto-apprentissage informatique\09_python\51_Qiita
[File_names]
todo=*todo*.txt
[Importance_color]
default=white
A=red
B=yellow
C=green
[Meta_data]
1=Date limite
2=Catégorie
Il s'agit d'une fonction permettant de changer la couleur de la liste TODO en fonction de la correspondance entre ** importance ** et ** couleur ** décrite dans le fichier de configuration.
Comme expliqué ci-dessus, vous pouvez définir ** [Importance_color] ** dans ** config.ini ** pour en faire la couleur de votre choix.
Le chemin du fichier est décrit sur l'écran de détails TODO, et vous pouvez ouvrir le ** fichier TODO ** en utilisant le ** programme par défaut du système d'exploitation ** en double-cliquant dessus.
Dans mon environnement, **. Txt ** est censé être ouvert dans Sakura Editor, donc cliquer sur le chemin du fichier à partir de l'écran de détails TODO ouvrira Sakura Editor.
Les détails sont décrits dans [Dernière page de message] [3].
Les fichiers de configuration mis à jour sont ** Importance_color ** et ** Meta_data **.
config.ini
[Dir_names]
#Le nom affiché dans le menu déroulant=Chemin absolu du dossier contenant le fichier TODO
#Exemple
qiita=F:\Document\800_Auto-apprentissage informatique\09_python\51_Qiita
[File_names]
#Le nom du fichier que vous souhaitez afficher dans la liste TODO. Caractère générique(*)Vous pouvez utiliser.
#Exemple
#Fichiers avec la chaîne todo au début
todo=todo*
#Fichiers avec l'extension py
python=*.py
[Importance_color]
#La couleur qui correspond à la chaîne utilisée dans le nom de fichier pour indiquer l'importance
#par défaut est la couleur utilisée pour les fichiers qui ne contiennent pas de chaîne d'importance.
#La couleur est spécifiée par une chaîne de caractères telle que le rouge ou le bleu.
default=white
A=red
B=yellow
C=green
[Meta_data]
#La position de la chaîne dans le fichier à utiliser comme métadonnées et le nom de clé des métadonnées
#De la première ligne du fichier TODO#Reconnaissez tout ce qui commence par des métadonnées.
# example: #2020/09/01 Date limite pour l'ajout de fonctions:2020/09/01 Catégorie:Des fonctions seront ajoutées.
# #Catégorie si la fonction est ajoutée:Une fonction sera ajoutée (la date limite sera ignorée car il y a un espace demi-largeur).
1=Date limite
2=Catégorie
Cela a simplement implémenté la méthode ** search_mata_data ** dans la classe ** Todo ** pour obtenir une liste de métadonnées renvoyées. La liste des métadonnées s'affiche avec ** listbox.insert **.
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 [""]
...
Depuis la classe ** TodoDisplay **, appelez la méthode ** sort_todo ** dans la classe ** Todo **.
La chaîne de caractères sélectionnée par ** combbox (pull-down) ** est passée en argument, et la fonction à appeler est modifiée en fonction de la chaîne de caractères passée par ** sort_todo **.
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
...
Transmettez le chemin du fichier à la méthode ** search_importance ** de la classe ** Todo ** et demandez-lui de renvoyer la couleur correspondante. Ensuite, utilisez ** listbox.itemconfig ** pour la coloration.
Je me suis référé au lien ci-dessous pour savoir comment colorer chaque ligne de la zone de liste.
[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})
...
...
...
En utilisant ** text.tag_bind **, vous pouvez associer ** event ** à une chaîne de texte. Vous pouvez également ouvrir le fichier ** path ** avec le programme par défaut défini dans ** OS ** en définissant ** os.system ("start" + path) **.
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)
D'une certaine manière, il est devenu amusant de développer l'application. Cela peut être la même chose que d'élever un personnage avec RPG.
J'espère l'utiliser à partir de maintenant et l'élargir davantage. Il est temps de rendre l'interface utilisateur solide.