Si vous souhaitez créer une application TODO (distribuée) en utilisant uniquement Python-Extension 1

[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

Résumé de cet article

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

Qu'est-ce que l'application TODO étendue (distribuée)?

Apparence

L'application est la suivante.

todo_ver2.jpg

Fonctionnalité améliorée

Les fonctions étendues sont les quatre suivantes.

Affichage des métadonnées décrites dans le fichier TODO

Les métadonnées sont ajoutées après le ** nom TODO ** en tant que ** date limite ** ou ** catégorie **.

todo_ver2_metadata.png

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

Tri des fichiers TODO en fonction de la date d'échéance et de l'importance

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.

todo_ver2_sort.png

** 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

Code couleur selon l'importance accordée au nom du fichier TODO

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.

Ouvrez l'éditeur de texte en cliquant sur le chemin depuis l'écran de détails TODO

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.

todo_ver2_open_texteditor.png

Comment utiliser

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

la mise en oeuvre

Affichage des métadonnées décrites dans le fichier TODO

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 [""]
    ...

Tri des fichiers TODO en fonction de la date d'échéance et de l'importance

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

Code couleur selon l'importance accordée au nom du fichier TODO

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

Ouvrez l'éditeur de texte en cliquant sur le chemin depuis l'écran de détails TODO

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)

À la fin

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.

Recommended Posts

Si vous souhaitez créer une application TODO (distribuée) en utilisant uniquement Python-Extension 1
Si vous souhaitez créer Word Cloud.
Si vous souhaitez créer une application Windows (exe) qui peut être utilisée maintenant en utilisant uniquement Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
Les débutants ont essayé de créer une application Web native pour le cloud à l'aide de Datastore / GAE
Si vous souhaitez afficher la valeur à l'aide des choix du modèle dans le modèle Django
Essayez de créer un site de gestion Todo en utilisant WebSocket avec Django (Swamp Dragon)
Créer une application de gestion de partition shogi à l'aide de Django 5 ~ Passer les données de la base de données au modèle ~
(Python) Essayez de développer une application Web en utilisant Django
Que faire si vous ne pouvez pas créer un environnement virtuel à l'aide de venv alors que vous suivez le site officiel de Django
Comment obtenir uniquement les données nécessaires du groupe de données structurées à l'aide d'une méthode polyvalente
Je vais créer un jeu pour contrôler le puzzle et les dragons en utilisant pygame
[Django] Que faire quand il y a de nombreux champs dans le modèle que vous souhaitez créer
Si vous souhaitez devenir data scientist, commencez par Kaggle
Que faire si vous obtenez moins zéro en Python
Que faire si vous obtenez une erreur de décodage Unicode avec l'installation de pip
Si vous souhaitez affecter une exportation csv à une variable en python
Comment enregistrer une partie d'une longue vidéo en utilisant OpenCV
Comment créer un fichier factice CSV contenant du japonais à l'aide de Faker
Vérifiez si vous pouvez vous connecter à un port TCP en Python
Créez un outil de ligne de commande pour convertir des dollars en yens en utilisant Python
Que faire si vous obtenez un avertissement "Mauvaise plateforme Python" lors de l'utilisation de Python avec l'EDI NetBeans