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

PyQt Python Discussion :

liste de bouton créer par un boucle ( clicked.connect ne marche pas) [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Manche (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 24
    Points : 17
    Points
    17
    Par défaut 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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Manche (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    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

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Manche (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    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

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Manche (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. .click sur un bouton créer dans un autre .click
    Par Castiel777 dans le forum jQuery
    Réponses: 2
    Dernier message: 05/02/2018, 16h22
  2. Réponses: 0
    Dernier message: 07/08/2014, 21h50
  3. Réponses: 5
    Dernier message: 08/01/2013, 17h00
  4. [AC-2003] Bouton "Click" qui ne marche pas
    Par Williamm dans le forum VBA Access
    Réponses: 2
    Dernier message: 22/07/2011, 12h02
  5. Récuperer le click d'un bouton créer dynamiquement
    Par DoRiane dans le forum ASP.NET
    Réponses: 2
    Dernier message: 23/07/2007, 14h33

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