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

  1. #1
    Membre à l'essai
    liste de bouton créer par un boucle ( clicked.connect ne marche pas)
    Bonjour à tous,
    d'abord un petit topo rapide, cette parti de mon app doit pouvoir crée des bouton pour lancer des app tierce lister en instance par un autre module.
    le problème c'est que seul le dernier bouton créer est fonctionnel les autre s affiche avec le nom associer mais il lance rien.


    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
     
     
    def game_icone(self):
     
            self.width, self.height = pyautogui.size()   #recup resolution écran
            self.div_width = self.width/15
            self.liste_btn_placement = [(int((self.div_width + 10) * 2)),(int((self.div_width +10) *3)),(int(self.div_width * 4 + 40)),(int(self.div_width * 5 + 50))]  # liste pour placer bouton sur axe abscisse
            self.position_des_fenetre = 0   # sans importance pour le moment
            if self.position_des_fenetre == 0: # idem
                ordonnee = 10
                comptage = 0 # pour ce deplacer dans la liste de position des abscisses
                directory = os.path.dirname(__file__)+"/test_exe/**"
                liste_dimage = ["hello", "blender","mouche"]
                for self.game in launch_other_app.get_extern_app(directory , liste_dimage):  # tourner dans la liste des instance des apps tierce
                    self.bouton_app = QtWidgets.QPushButton(self.game.app_name(),self)
                    #self.bouton_jeux.setIcon(QtGui.QIcon(os.path.dirname(__file__)+'/image/taff.jpg'))
                    coordonnee = self.liste_btn_placement[comptage]
                    self.bouton_app.move(coordonnee,ordonnee)
                    comptage += 1
                    self.bouton_app.resize(self.width/15 ,self.width/15)
                    #self.bouton_jeux.setIconSize(QtCore.QSize(self.width/15-1,self.width/15-1))
     
    #la ça peche
                    self.bouton_app.clicked.connect(self.game.launch) # (.launch) lancer l application avec le directory joint dans l'instance.
     
                    self.bouton_app.show()


    bonne journée

  2. #2
    Expert éminent sénior
    Salut,


    Comme vous écrivez for self.game in... et utilisez des variables d'instances dans la boucle (plutôt que des variables locales)... à sa sortie, on se retrouve avec le dernier qui.

    Ce n'est peut être pas une bonne piste mais c'est tout ce que je peux raconter à la lecture du bout de code que vous avez posté.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. ###raw>post.musername###
    Membre à l'essai
    Bonjour,
    l'idée c'est de faire une appli proche de celle du desktop de windows mais avec différent systèmes est raccourcis en suppléments, mais pour le moment je dois déjà gérer les raccourcis vers les apps externes.

    j'ai essayé de supprimer les "self." mais du coup le ".launch" devient nos fonctionnel, je suppose que il prend le "directory" de base du coup au lieu de celui de l'instance.
    je vais poser le code en entier si ça aide , je ne voulais pas mettre un pavé si c'était pas nécessaire.

    je vous ai épargné les import de modules.

    L'interface :

    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
     
     
    #fenetre principal: 
    class Bureau (QtWidgets.QWidget):
    # initialisation: 
        def __init__(self):
            super().__init__()
            self.width, self.height = pyautogui.size()
            self.fenetre_bureau()
            self.connect_ui()
     
     
     
    # layout principal avec ses boutons: 
        def fenetre_bureau(self):
     
            self.btn_fermer= QtWidgets.QPushButton("X",self)
            self.btn_fermer.move((self.width/2)-75,self.height-45)
     
            self.btn_taff = QtWidgets.QPushButton(self)
            self.btn_taff.setIcon(QtGui.QIcon(os.path.dirname(__file__)+'/image/taff.jpg'))
            self.btn_taff.move(self.width - self.width/15 -10,10)
            self.btn_taff.resize(self.width/15 , self.width/15)
            self.btn_taff.setIconSize(QtCore.QSize(self.width/15-1,self.width/15-1))
     
            self.btn_game = QtWidgets.QPushButton(self)
            self.btn_game.setIcon(QtGui.QIcon(os.path.dirname(__file__)+'/image/taff.jpg'))
            self.btn_game.move(10 , 10)
            self.btn_game.resize(self.width/15 ,self.width/15)
            self.btn_game.setIconSize(QtCore.QSize(self.width/15-1,self.width/15-1))
     
     
     
            self.btn_contact = QtWidgets.QPushButton("     C",self)
            self.btn_contact.move(-75,self.height-45)
     
     
     
     
     
    # connection: 
        def connect_ui(self):
            self.btn_fermer.clicked.connect(self.quitter)
            self.btn_game.clicked.connect(self.game_icone)
     
     
     
    # ouvre les icone game
        def game_icone(self):
     
            self.width, self.height = pyautogui.size()
            self.div_width = self.width/15
            self.liste_btn_placement = [(int((self.div_width + 10) * 2)),(int((self.div_width +10) *3)),(int(self.div_width * 4 + 40)),(int(self.div_width * 5 + 50))]
            self.position_des_fenetre = 0
            if self.position_des_fenetre == 0:
                ordonnee = 10
                comptage = 0
                directory = os.path.dirname(__file__)+"/test_exe/**"
                liste_dimage = ["hello", "blender","mouche"]
                for self.game in launch_other_app.get_extern_app(directory , liste_dimage):
                    self.bouton_app = QtWidgets.QPushButton(self.game.app_name(),self)
                    #self.bouton_jeux.setIcon(QtGui.QIcon(os.path.dirname(__file__)+'/image/taff.jpg'))
                    coordonnee = self.liste_btn_placement[comptage]
                    self.bouton_app.move(coordonnee,ordonnee)
                    comptage += 1
                    self.bouton_app.resize(self.width/15 ,self.width/15)
                    #self.bouton_jeux.setIconSize(QtCore.QSize(self.width/15-1,self.width/15-1))
                    self.bouton_app.clicked.connect(self.game.launch)
                    self.bouton_app.show()
                    print(self.game)
     
     
     
     
     
     
     
     
    # quitter: 
        def quitter(self):
            exit()
     
     
     
    app = QtWidgets.QApplication([])
    ui = Bureau()
    ui.setWindowFlags(QtCore.Qt.FramelessWindowHint)
    ui.showMaximized()
    ui.move(1, 1)
    ui.show()
    app.exec_()



    le module launch_other_app

    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
     
     
    # recuperer instance d'app
    def get_extern_app(directory,liste_dimage):
        appli_ext = []
        appli_ext = [Other_app(fichier) for fichier in glob.glob(directory, recursive=True ) if fichier.endswith(".lnk")]
        return appli_ext
     
    # les differente utilisation des app externe
    class Other_app:
        def __init__(self , directory):
            self.directory = directory
     
    # .app_name(): nom de l app
        def app_name(self):
            self.name = (self.directory.split('\\')[-1])
            self.name = self.name.split(".")[0]
            return self.name
    # .launch(): lancement de l app
        def launch(self):
            os.startfile (self.directory)
    # .icone(): icone de l app    
        def icone(self,liste_dimage):
            for image_name in liste_dimage:
                if self.name == image_name:
                    print(image_name)


    En espérant que cela vous simplifie la tache.
    je suis un débutant du coup même poser du code sur un fofo je doit apprendre
      0  0

  4. #4
    Expert éminent sénior
    Salut,

    Citation Envoyé par Agrihnam Voir le message
    j'ai essayé de supprimer les "self." mais du coup le ".launch" devient nos fonctionnel, je suppose que il prend le "directory" de base du coup au lieu de celui de l'instance.
    Çà veut sans doute dire que connect garde une weak référence à l'objet et comme aucun n'est plus référencé (même pas le dernier), plus rien ne marche.

    Créez une liste self.games et ajoutez y les items:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
                self.games = []
                for game in launch_other_app.get_extern_app(directory , liste_dimage):
                     self.games.append(game)

    Si ma théorie est correcte, çà devrait tomber en marche.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Verdict, ça fonctionne parfaitement.

    si il était possible d'avoir une explication sur le pourquoi du comment.

    Et enfin, en tant que novice si je pouvais avoir un petit retour sur la qualité de mon code pour le moment voir ce que je dois améliorer.
    en tous les cas merci beaucoup pour votre aide.
    bonne journée

  6. #6
    Expert éminent sénior
    Citation Envoyé par Agrihnam Voir le message
    si il était possible d'avoir une explication sur le pourquoi du comment.
    Débuter avec PyQt, c'est un plongeon direct dans la programmation orientée objets. Et même, si avec Python tout est objet, normalement, on découvre leurs facéties petit à petit et on devrait savoir ce que veut dire "weak reference" lorsqu'on aborde PyQt.

    Pour faire vite, un objet se crée et se détruit.
    Pour faciliter la vie des programmeurs qui oublient de détruire les objets qu'ils n'utilisent plus, a été inventé un garbage collector (ramasse miette en français) qui libère la mémoire occupée par les objets non référencés (par d'autres objets).

    Avec Python, créer une référence à un objet, c'est par exemple l'assigner à une variable ou en faire l'item d'une liste. Et Python maintient pour chaque objet un compteur du nombre de références et s'il passe à zéro, l'objet est détruit.

    Problème: si on passe la méthode d'un objet à connect pour qu'elle puisse être appelée plus tard, on n'a pas envie de créer une référence qui garderait l'objet en vie alors qu'il n'existe plus. Et pas facile de savoir qu'une méthode a été passée à connect (ou autre) pour aller défaire cette association.

    C'est pour cela qu'on a inventé les "weak reference": elle n'empêchent pas la destruction de l'objet mais si le signal qui devait appeler la méthode détecte que l'objet n'existe plus, çà ne fait rien.

    Citation Envoyé par Agrihnam Voir le message
    Et enfin, en tant que novice si je pouvais avoir un petit retour sur la qualité de mon code pour le moment voir ce que je dois améliorer.
    Donnez vous les moyens de produire un "code de qualité" en prenant le temps d'apprendre les bases avant d'essayer de programmer.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai
    Merci pour ses retours constructif, et pour l aide apportée, je vais tacher d'améliorer mes connaissances pour appréhender comme il faut le code.
    je vous souhaite une bonne journée.

###raw>template_hook.ano_emploi###