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 :

Pyside QPushButton et mémoire


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut Pyside QPushButton et mémoire
    Bonjour,

    je n'ai pas une formation de développeur. C’est pourquoi j'ai besoin de vos expériences.
    J'ai un script (qui marche dans l'état mais ...) qui construit des boutons en fonction des changements d'un Qcombo, en fait à chaque fois que je fais un choix cela me reconstruit des boutons (120) et cela les place dans un gridLAyout.
    Je me pose une question, si je laisse ma fenêtre ouverte toute la journée, et si je fais des changement dans le combo et donc je rebuild des boutons, je vais saturer la memoire (certainement pas au vu de mon application pas trop gourmande mais dans la théorie )
    J'aimerais savoir comment je pourrais faire pour remplacer (vraiment) les anciens boutons par les nouveaux.
    Je poste un passage du code (les boutons ouvrent des movs, ils auront à chaque fois une couleur en fonction des étapes choisies dans le Qcombo) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    # build step items
    		self.myLabel = QtWidgets.QLabel("Steps : ")
    		self.myLabel.setAlignment(QtCore.Qt.AlignRight)
    		self.my_grid_layout.addWidget(self.myLabel,1,6,1,1)
    		self.my_input_steps = QtWidgets.QComboBox(self)
    		self.my_input_steps.addItem("")
     
    		for each_step in self.my_steps:
    			self.my_input_steps.addItem(each_step)
    		self.my_input_steps.currentIndexChanged.connect(self.build_shots)
    		self.my_grid_layout.addWidget(self.my_input_steps,1,7,1,1)

    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
     
    def build_shots(self):
    		# Get selected episode
    		self.my_get_episode = self.my_input_episode.currentText()
    		self.my_console.setText("Episode : "+self.my_get_episode)
    		self.my_console.setStyleSheet("color:white")
     
    		# Get selected episode
    		self.my_get_steps = self.my_input_steps.currentText()
    		self.my_console.setText("Episode : "+self.my_get_episode + " --- "+self.my_get_steps )
    		self.my_console.setStyleSheet("color:green;font-weight:bold")
     
    		# change the color of my_input_episode and my_input_steps
    		if self.my_get_episode != "":
    			self.my_input_episode.setStyleSheet("background-color:#004666")
    		else:
    			self.my_input_episode.setStyleSheet("background-color:#4F4F4F")
    		if self.my_get_steps != "":
    			self.my_input_steps.setStyleSheet("background-color:#004666")
    		else:
    			self.my_input_steps.setStyleSheet("background-color:#4F4F4F")
     
    		# HERE WE BUILD THE BUTTONS
    		if self.my_get_steps != "" and self.my_get_episode != "":
    			# Build shots
    			my_list_shots = ['']
    			for x in xrange(1,100):
    				my_list_shots.append(str(x))
     
    			x=2 # line 1 has the menu
    			y=1 # row
    			incrementLineX=1 # every 10 we go to line 2 (x+1) and reset incrementLine and y (row) to 1
    			for i in xrange(1,121):
    				try:
    					my_shot_number=my_list_shots[i]
    					my_shot_number = "%03d"%int(my_shot_number)
    					self.buttons = QtWidgets.QPushButton(my_shot_number,self)
    					self.buttons.setStyleSheet("background-color:brown;color:white")
    					self.buttons.clicked.connect(partial(self.my_open_mov,my_shot_number))
    					self.my_grid_layout.addWidget(self.buttons,x,y,1,1)
    				except Exception as e:
    					self.buttons = QtWidgets.QPushButton("",self)
    					self.buttons.setEnabled(False)
    					my_shot_number=""				
    				y=y+1
    				incrementLineX=incrementLineX+1
    				if incrementLineX>10:
    					x=x+1
    					y=1
    					incrementLineX = 1
    J'aimerais vraiment être dans la bonne direction, j'ai regardé du coté de deleteLater mais je ne suis pas certain de bien comprendre.
    merci beaucoup de votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Ton code m'a l'air particulièrement brouillon.

    Pour ta my_list_shots tu convertis des entiers en strings et pour ton my_shot_number tu reconvertis en entier.

    Ta première liste my_list_shots contient 100 éléments et dans la boucle, tu itères sur 120 éléments. Est-ce voulu ?

    Tu dois conserver les références des boutons dans une liste et tu n'as aucun besoin de tout ce montage avec incrementLineX, il suffit de boucler sur le nombre de lignes et le nombre de colonnes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for y in range(lines):
        for x in range(columns):
            use x, y
    Pour effacer le tableau de boutons tu utiliseras simplement la liste crée pendant la construction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        def clear_board(self):
            for btn in self.buttons:
                self.my_grid_layout.removeWidget(btn)
                btn.setParent(None)
                btn.deleteLater()
     
            self.buttons = []

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Octobre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Octobre 2019
    Messages : 6
    Par défaut
    Hello,

    c'est tout a fait exact mais j'ai fait cela rapidement de chez moi ce weekEnd étant déconnecté de mes arbos de travail et de la base de données, je voulais surtout tester une interface.
    J'ai tout reconnecté et cleané ce matin : je vais donc chercher des dictionnaires depuis la base de données et en effet je loop ensuite pour créer mes boutons (en fonction des shots, status etc...)
    Mais merci d'avoir pris du temps pour me répondre.

    Pour répondre à ma question, le soucis est maintenant résolu (merci à mon dev et merci à toi !!! )
    Je récupère les items de mon grid layout que je détruis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	def clearShotsWidget(self):
    		while self.shotsWidgetLayout.count():
    			item = self.shotsWidgetLayout.takeAt(0)
    			item.widget().deleteLater()
    			self.shotsWidgetLayout.removeItem(item)
    Je vais tester le tient, cela me parait très utile !
    Encore merci d'avoir pris du temps !

    Gui

Discussions similaires

  1. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38
  2. Accéder à un espace mémoire sous XP
    Par keny dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 02/08/2002, 12h37
  3. Déterminer l'adresse d'une application en mémoire
    Par Gib dans le forum x86 32-bits / 64-bits
    Réponses: 9
    Dernier message: 11/06/2002, 14h27
  4. Vitesse de la mémoire vidéo
    Par Anonymous dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 06/06/2002, 20h20
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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