IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Présentation d'une app (qui existe peut-être déja)


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 142
    Par défaut Présentation d'une app (qui existe peut-être déja)
    Salut,

    Travaillant sur différents OS, Un iMac en poste fixe et un portable (en dual boot Windows/Linux), j’ai pris la fâcheuse manie de faire depuis mon Mac Cmd/c (équivalent de Ctrl/c) et Ctrl/v sur mon portable en espérant que par magie le presse-papier du Mac allait se transférer sur le portable….
    Ayant un compte Dropbox, je me suis dit pourquoi ne pas automatiser le copier/coller en passant par le cloud.

    Il y a des pré-requis :
    Avoir un compte Dropbox (mais je pense qu’avec un autre cloud ça fonctionne aussi, suffit de modifier le script)
    Avoir installé PyQt5

    Son fonctionnement :
    Copier le contenu du presse-papier dans Dropbox qui sera automatiquement récupérer dans le presse-papier d’un autre ordinateur .
    Alors bien-sur vos remarques et commentaires sont les bienvenus.

    Ci-joint le zip contenant le script et les png.

    https://www.dropbox.com/s/p6suav3l5r...Cloud.zip?dl=0

    Le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
     
    # -*- Coding: utf-8 -*-
    # Created by Diablo76 on 14/02/2023 -- 07:41:27.
     
    import os
    import sys
    from pathlib import Path
     
    from PyQt5.QtCore import Qt, QTimer
    from PyQt5.QtGui import QIcon, QImage, QPixmap
    from PyQt5.QtWidgets import (
        QAction,
        QApplication,
        QDesktopWidget,
        QLabel,
        QMainWindow,
        QMenu,
        QMessageBox,
        QSystemTrayIcon
    )
     
    # Constantes globales
    _VERSION = "1.06"
    CLOUD = "Dropbox"
    PATH_CLOUD = f"{Path.home()}{os.sep}{CLOUD}{os.sep}.ClipboardToCloud{os.sep}"
    PATH_FILE = PATH_CLOUD + "clipboard.data"
    TITLE = f"Clipboard To {CLOUD} {_VERSION}"
     
     
    class ToolTip(QLabel):
        """Affichage d'un QLabel d'apparence QToolTip"""
        def __init__(self):
            super().__init__()
            self.setWindowFlags(Qt.ToolTip)  # type: ignore
            self.setStyleSheet(
                "border: 1px solid black; background-color: rgb(200,200,180)"
            )
            self.setWindowOpacity(0.8)
            self.center = QDesktopWidget().availableGeometry().center()
     
        def show(self):
            """Affichage du tooltip au centre de l'écran
            avec une durée de 2.5 secondes"""
            super().show()
            self.move(
                int(self.center.x() - self.width() / 2),
                int(self.center.y() - self.height() / 2)
            )
            QTimer.singleShot(2500, self.hide)
     
     
    class MainWindow(QMainWindow):
        """MainWindow"""
        def __init__(self):
            super().__init__()
            self.directory_exist()
            self.tray = QSystemTrayIcon()
            self.tool_tip = ToolTip()
            self.icons = {
                "Dropbox": QIcon(QPixmap("dropbox.png")),
                "Clipboard": QIcon(QPixmap("clipboard.png")),
                "Loupe": QIcon(QPixmap("loupe.png"))
            }
            self.clipboard = QApplication.clipboard()
            self.create_trayicon()
            self.old_data = os.path.getsize(PATH_FILE)
            self.new_data = None
            self.timer = QTimer()
            self.timer.setInterval(1000)
            self.timer.timeout.connect(self.data_changed)
            self.timer.start()
     
        def directory_exist(self):
            """Controle et création du répertoire sur le Cloud"""
            if not os.path.isdir(PATH_CLOUD):
                try:
                    os.mkdir(PATH_CLOUD)
                    with open(PATH_FILE, "wb") as file:
                        file.write(TITLE.encode("utf-8"))
                except (FileNotFoundError, PermissionError):
                    QMessageBox.warning(
                        self,
                        TITLE,
                        f"Impossible de créer le répertoire {PATH_CLOUD}"
                    )
                    sys.exit()
     
        def data_changed(self):
            """Contrôle de l'état du fichier"""
            self.new_data = os.path.getsize(PATH_FILE)
            if self.new_data != self.old_data:
                self.paste_to_clipboard()
                self.old_data = self.new_data
     
        def copy_to_cloud(self):
            """Copie du fichier binaire sur le Cloud"""
            if self.clipboard.mimeData().formats():
                if self.clipboard.mimeData().hasImage():
                    pixmap = self.clipboard.pixmap()
                    pixmap.save(PATH_FILE, "PNG")
                    self.show_message(f"Image copiée dans {CLOUD}.", QIcon(pixmap))
                elif self.clipboard.mimeData().hasText():
                    text = self.clipboard.text()
                    with open(PATH_FILE, "wb") as file:
                        file.write(text.encode("utf-8"))
                    self.show_message(f"Texte copié dans {CLOUD}.", self.icons["Dropbox"])
                self.old_data = os.path.getsize(PATH_FILE)
            else:
                self.show_message(
                    "Le Presse-papier est vide !!!.",
                    QSystemTrayIcon.Warning,  # type: ignore
                )
     
        def paste_to_clipboard(self):
            """Copie du fichier binaire du cloud vers le presse-papier"""
            with open(PATH_FILE, "rb") as file:
                data = file.read()
            header = data[0:4]
            if header == b"\x89PNG":
                image = QImage.fromData(data)
                self.clipboard.setImage(image)
                self.show_message(
                    "Image collée dans le Presse-papier.",
                    QIcon(QPixmap(image))
                )
            else:
                self.clipboard.setText(data.decode("utf-8"))
                self.show_message(
                    "Texte collé dans le Presse-papier.", self.icons["Clipboard"]
                )
     
        def create_trayicon(self):
            """Création du QSystemTrayIcon"""
            self.tray.setIcon(self.icons["Clipboard"])
            self.tray.setVisible(True)
            self.tray.setToolTip(TITLE)
            menu = QMenu(self)
            opt_copy = QAction(
                parent=self, text=f"Copier dans {CLOUD}", icon=self.icons["Dropbox"]
            )
            opt_copy.triggered.connect(self.copy_to_cloud)
            menu.addAction(opt_copy)
            opt_paste = QAction(
                parent=self,
                text="Coller dans le Presse-papier",
                icon=self.icons["Clipboard"]
            )
            opt_paste.triggered.connect(self.paste_to_clipboard)
            menu.addAction(opt_paste)
            show_clipboard = QAction(
                parent=self, text="Apperçu du presse-papier", 
                icon=self.icons["Loupe"]
            )
            show_clipboard.triggered.connect(self.show_clipboard)
            menu.addAction(show_clipboard)
            menu.addSeparator()
            quit_app = QAction(parent=self, text="Quitter")
            quit_app.triggered.connect(app.quit)
            menu.addAction(quit_app)
            self.tray.setContextMenu(menu)
     
        def show_clipboard(self):
            """Affichage du presse-papier"""
            if self.clipboard.mimeData().formats():
                if self.clipboard.mimeData().hasImage():
                    pixmap = self.clipboard.pixmap().scaledToWidth(
                        500, Qt.SmoothTransformation  # type: ignore
                    )
                    self.tool_tip.setPixmap(pixmap)
                else:
                    self.tool_tip.setText(self.clipboard.text())
                self.tool_tip.show()
            else:
                self.show_message(
                    "Le Presse-papier est vide !!!.",
                    QSystemTrayIcon.Warning  # type: ignore
                )
     
        def show_message(self, message: str, icon: QIcon):
            """Affichage de la notification avec une durée de 3 secondes"""
            self.tray.showMessage(TITLE, message, icon, 3000)
     
     
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        main_win = MainWindow()
        sys.exit(app.exec_())
    Edit: Il n'y a pas d'UI c'est un TrayIcon

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Marrant ce truc. Moi chaque fois que je vois du Qt je suis content car j'apprends des trucs. Mais pourquoi tu ne le proposes pas en tant que code source Python ???

    Citation Envoyé par Diablo76 Voir le message
    Alors bien-sur vos remarques et commentaires sont les bienvenus.
    PATH_CLOUD = f"{Path.home()}{os.sep}{CLOUD}{os.sep}.ClipboardToCloud{os.sep}"
    Hum... C'est quand-même dommage d'utiliser pathlib et de créer ce chemin de façon si pénible (alors que justement pathlib est fait pour ça !!!)
    PATH_CLOUD = Path(Path.home(), CLOUD, ".ClipboardToCloud") !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 142
    Par défaut
    Merci de ta réponse.
    Alors os.sep me réconforte, mais tu as raison, je vais modifier ça.
    Pour ce qui est de code source Python, est-elle suffisamment aboutie??, Il y a surement des améliorations à faire.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Diablo76 Voir le message
    Il y a surement des améliorations à faire.
    Certainement mais l'avantage c'est que le truc restera présent. Parce que ce topic, dans 15 jours il aura disparu dans les profondeurs du forum. Et en plus il sera définitivement associé à ton pseudo (le petit tableau noir au dessus de mon avatar).

    Et quand tu fais des améliorations il te suffit ensuite d'éditer ton topic posté dans "codes sources" et repositionner le nouveau script, il est alors modifié et ceux qui le téléchargent à partir de ce moment téléchargent alors le nouveau.

    Citation Envoyé par papajoker Voir le message
    Citation Envoyé par Sve@r Voir le message
    alors que justement pathlib est fait pour ça !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 142
    Par défaut
    C'est pas un truc, c'est juste un script, de ta part je attendais à plus de critiques, maintenant pourquoi pas ??

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Diablo76 Voir le message
    de ta part je attendais à plus de critiques
    Ok. Alors
    1. quand on fait de l'héritage d'objet Qt, il faut proposer un objet ayant les mêmes propriétés que l'objet hérité. Par exemple un QLabel peut être instancié avec un texte, un parent, des flags, il faut donc que le ToolTip soit instanciable à minima de la même façon.
      Code python : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      class ToolTip(QLabel):
      	"""Affichage d'un QLabel d'apparence QToolTip"""
      	def __init__(self, *args, **kwargs):
      		super().__init__(*args, **kwargs)
      Et pareil pour tous les autres objets. Et en ce qui concerne le ToolTip, pour plus de souplesse, il pourrait recevoir la tempo en paramètre au lieu de la mettre d'office à 2500 millisecondes
      Code python : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      class ToolTip(QLabel):
      	"""Affichage d'un QLabel d'apparence QToolTip"""
      	def __init__(self, tempo=2.5, *args, **kwargs):
      		super().__init__(*args, **kwargs)
      		self.__tempo=tempo*1000
    2. le QMainWindow pourrait recevoir ses éléments de travail en paramètre. Plus généralement, pour rendre ton script totalement indépendant/intégrable dans une autre appli, il ne devrait contenir aucune variable globale et placer le code "spécifique script" dans un bloc if __name__ == "__main__"
    3. les attributs et méthodes internes doivent commencer par des double underscores (afin que ton objet soit protégé de l'extérieur)
    4. si on vire le fichier "clipboard_data" il n'est pas recréé au lancement du script qui tombe en erreur (c'est quand tu récupères sa taille via os.path.getsize(PATH_FILE), opération qui me laisse dubitatif quant à son but car il y a d'autres façons plus robustes de détecter un changement de fichier que comparer sa taille avant/après => pathlib.Path(...).stat().st_mtime)
    5. pas besoin d'encoder et décoder ton texte en utf-8. Tu bennes le texte en vrac dans le fichier binaire, tu le récupèreras à l'identique.

    Et pour les évolutions, le script pourrait historiser n presse-papiers et offrir de récupérer l'un ou l'autre (comme le fait l'éditeur de texte Unix "vi").
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 306
    Par défaut
    bonjour
    Citation Envoyé par Diablo76;
    pré-requis : Avoir un compte Dropbox (mais
    Tout à fait, même un nas fait l'affaire, en fait il faut juste un répertoire partagé.

    Puisque nous sommes développeurs, il est aussi possible de faire la même chose (pour du texte) avec gist (gitlab,gitub,...). Mais créer des gists privés demande une api et le code devient bien différent (providers, Repertoire(Provider), Gist(Provider), Gitlab(Provider), pasteBin(Provider)...).

    Citation Envoyé par Sve@r Voir le message
    alors que justement pathlib est fait pour ça !!!
    Et de plus, existe une autre façon de l'écrire (qui retourne le même type)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PATH_CLOUD = Path.home() / CLOUD / ".ClipboardToCloud"
    note : mettre le séparateur à la fin du répertoire, je ne suis pas fan.

    EDIT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    os.path.isdir(PATH_CLOUD)
    os.mkdir(PATH_CLOUD)
    Si on utilise pathlib, autant ne plus utiliser os puisque cette variable n'est plus une chaine

  8. #8
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par Diablo76 Voir le message
    Alors bien-sur vos remarques et commentaires sont les bienvenus.
    A priori, je dirais non.

    Ou bien ce sont nos remarques et commentaires qui seraient les bienvenus, mais pas nous.


  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Arioch Voir le message
    A priori, je dirais non.
    En fait c'est un exemple concret d'un dicton provençal "fais du bien à Bertrand, te le rend en caguant". Et si ce dicton (repris par Marcel Pagnol dans "Manon des sources") a été créé, c'est bien parce les ingrats de ce genre sont légion.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    Bonjour,

    Ce que je trouve dommage c'est de ne pas présenter ce code via un lien vers une plateforme web de gestion de codes sources telle que GitLab, GitHub, ... (pour les plus connus) et de demander simplement une revue de code collaborative.

    J'ai l'impression qu'on pourrait encore découper, je vois deux responsabilités :
    1. Les fichiers et les répertoires
    2. Le clipboard (gestion des interactions avec le presse papier)


    On pourrait aussi étendre les fonctionnalités, par exemple indiquer le type de contenu du presse papier, déterminer si c'est une image ou un texte, dans pourquoi pas un ClipBoardManager ?

    Un FileManager, permettrait aussi d'éviter comme pour ClipBoardManager des dépendances qui seraient difficilement maintenables...

    Nommer MainWindow pour se rapprocher d'une problématique concrète avec un nom plus concret comme ClipBoardCloudManager.

    C'est pas grand chose, le code fonctionne et à mon sens, si pas ou peu d'évolutions, la partie ISP (Interface Segregation Principle) comme proposé précédemment me semble overkill.

    C'est pas parce-qu'un principe très connu est une bonne pratique, qu'il ne faut pas adapter à son projet... savoir faire le tri sur les principes et ne pas les appliquer sans réfléchir à l'objectif final !

  11. #11
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 142
    Par défaut
    Salut et désolé de répondre aussi tardivement,

    @fred1599:
    En ce qui concerne le découpage pourquoi pas mais le but de ce script c'est de transférer le contenu du presse-papier d'un ordi à un autre sans tenir compte de l'os et du réseau.

    @pour_les_autres:
    J'ai pris en compte plusieurs de vos remarques et critiques.

    Le dépôt :

    https://github.com/diablo76600/ClipboardToCloud

  12. #12
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    Salut !

    Citation Envoyé par Diablo76 Voir le message
    Salut et désolé de répondre aussi tardivement,

    @fred1599:
    En ce qui concerne le découpage pourquoi pas mais le but de ce script c'est de transférer le contenu du presse-papier d'un ordi à un autre sans tenir compte de l'os et du réseau.


    https://github.com/diablo76600/ClipboardToCloud
    et donc ? Je ne comprend pas non plus la relation entre ma demande de découpage et la prise en compte de l'OS et du réseau, je veux bien que tu m'éclaires...

    Il n'y a pas de réelles excuses à ne pas appliquer les bonnes pratiques, et cela quelque soit le projet. Le découpage est surtout lié au fait de rendre plus facile le debuggage de ton code. Si tu reviens deux ou trois années sur ton projet, tu souhaiteras sans doute gagner du temps à sa lecture. On pourrait très bien imaginer que ce projet en partie ou entièrement soit repris comme base sur un sujet plus complexe...

    Ce qui est déjà très bien, c'est que tu es partagé cela sur une plateforme, ça peut éventuellement aidé à faire évoluer ton projet.

    Après il y a beaucoup de choses à en dire, mais je ne sais pas si tu es vraiment près à faire du refactoring sur ton code

    Si tu considères que c'est fonctionnel et que pas besoin de plus, je ne perdrai pas de temps à faire des remarques sur ton code, dans le cas contraire, je peux faire des propositions via GitHub.

  13. #13
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 142
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Salut !

    Il n'y a pas de réelles excuses à ne pas appliquer les bonnes pratiques, et cela quelque soit le projet. Le découpage est surtout lié au fait de rendre plus facile le debuggage de ton code. Si tu reviens deux ou trois années sur ton projet, tu souhaiteras sans doute gagner du temps à sa lecture. On pourrait très bien imaginer que ce projet en partie ou entièrement soit repris comme base sur un sujet plus complexe...

    Ce qui est déjà très bien, c'est que tu es partagé cela sur une plateforme, ça peut éventuellement aidé à faire évoluer ton projet.

    Après il y a beaucoup de choses à en dire, mais je ne sais pas si tu es vraiment près à faire du refactoring sur ton code

    Si tu considères que c'est fonctionnel et que pas besoin de plus, je ne perdrai pas de temps à faire des remarques sur ton code, dans le cas contraire, je peux faire des propositions via GitHub.
    Salut,

    Si bien sur que j'accepte tes remarques et propositions notamment sur le découpage et le refactoring

  14. #14
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Sans avoir regardé le code, pour ma part voici mes remarques :

    1. le dossier .vscode n'a rien à faire dans le repo. Un fichier .gitignore solutionnerait cela.
    2. en l'état, le programme récupéré n'est pas utilisable. Il faudrait à minima un fichier requirements.txt contenant les librairies additionnelles afin d'éviter d'avoir ce qui suit au lancement du programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ModuleNotFoundError: No module named 'PyQt5'
    3. un README.md plus étoffé serait un plus appréciable et apprécié je pense.


  15. #15
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 142
    Par défaut
    Salut,

    Sur les conseilles et la bienveillance de @fred, j'ai revu ma façon de penser le code:

    https://github.com/diablo76600/ClipboardToCloud

    Bon, je ne suis pas sur d'avoir répondu à ce qui qui est le refactoring

  16. #16
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    Nettement mieux ! Rien à voir avec ce que tu proposais au départ, c'est modulable et maintenable.

    Quelques points,

    Plutôt que le package Modules, on pourrait créer un package service et un package ui pour séparer l'utilisation et la présentation utilisateur.

    et concernant ce morceau de code par exemple (regarder si pas d'autres cas comme celui-ci)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def file_changed(self) -> None:
      if self.service_directory_file.file_is_changed is False:
          self.manager.paste_to_clipboard()
      self.service_directory_file.file_is_changed = False
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def file_changed(self) -> None:
      if not self.service_directory_file.file_is_changed:
          self.manager.paste_to_clipboard()
      self.service_directory_file.file_is_changed = False

Discussions similaires

  1. [AC-2010] Champ d'une requête sélection qui ne peut être mis à jour
    Par Daejung dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 22/10/2015, 14h58
  2. Réponses: 1
    Dernier message: 16/11/2007, 10h28
  3. Une DLL qui existe mais VB ne la trouve pas...
    Par Lawari dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 09/12/2005, 23h16
  4. Réponses: 2
    Dernier message: 10/03/2004, 18h52
  5. Une table qui existe mais qui est inconnu! ?
    Par Nino dans le forum InterBase
    Réponses: 6
    Dernier message: 13/06/2003, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo