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 :

Bouton pour supprimer des éléments de l'interface


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    bebenc
    Invité(e)
    Par défaut Bouton pour supprimer des éléments de l'interface
    Salut,

    Je me suis mis à Python y'a peu (depuis le début du mois) pour faire 1 ou 2 petits programmes dont je peux avoir besoin pour le boulot.
    Pour le moment je bosse sur le premier programme, un petit utilitaire pour créer un fichier de batch (fichier qui lance des simulations de fluides en mode -nogui )

    Jusque là j'ai réussi à bien avancer et à trouver des réponses aux problèmes que j'ai eu, merci Google , mais là je trouve pas (surtout que je sais pas vraiment comment formuler ma recherche).

    Comme je ne sais pas à l'avance combien je vais avoir de simulations à lancer j'ai besoin d'une interface "dynamique".
    Pour chaque simulation j'ai besoin de quelques paramètres ( chemin du fichier, range si besoin, etc... ), pour ça j'ai donc fait une groupbox dans laquelle se trouve tous les éléments dont j'ai besoin.
    J'ai un bouton qui créer une nouvelle groupbox et l'ajoute dans l'interface, jusque là ça marche.
    Par contre je voudrais avoir un bouton pour supprimer une groupbox si besoin, le problème c'est que ma groupbox est définie dans un autre fichier .py

    La question est comment faire en sorte qu'à chaque fois que je crée ma groupbox, elle et les éléments qu'elle contient soient uniques ( avec un nom unique ) et pour qu'ensuite mon bouton supprime bien la groupbox correspondante ?

    J'ai peur que l'explication soit un peu confuse , du coup, et aussi pour travailler sur mon code sans détruite tout ce qui fonctionne, j'ai fait une version simplifiée de mon problème.
    Une interface avec un bouton "Add", à chaque fois que je clique sur "Add" je crée un QLineEdit et un bouton "-"
    Ce que je voudrais c'est que le bouton "-" supprime le "LineEdit" correspondant, pour le moment j'arrive uniquement à supprimer le dernier créé.

    voilà le code des 2 fichiers, sans la fonction delete ( comme je débute le code est très certainement merdique )

    Fichier Main.py :
    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
    # -*- coding: utf-8 -*-
     
    from PyQt5 import QtCore, QtGui, QtWidgets
    from Mon_Module import *
     
    class Ui_Mon_Interface(object):
    	def setupUi(self, Mon_Interface):
    		Mon_Interface.setObjectName("Mon_Interface")
    		Mon_Interface.setWindowTitle("Test")
    		Mon_Interface.resize(450, 250)
     
    		self.Layout_Zone = QFormLayout()
     
    		self.Add_Btn = QtWidgets.QPushButton(Mon_Interface)
    		self.Add_Btn.setObjectName("Add_Btn")
    		self.Add_Btn.setText("Add")
     
    		self.Widget_Affichage = QtWidgets.QWidget(Mon_Interface)
    		self.Widget_Affichage.setObjectName("Widget_Affichage")
    		self.Widget_Affichage.setGeometry(QtCore.QRect(30,30,250,200))
    		self.Widget_Affichage.setMaximumSize(250,450)
    		self.Widget_Affichage.setAutoFillBackground(True)				
    		self.Widget_Affichage.setLayout(self.Layout_Zone)
     
    		self.Add_Btn.clicked.connect(self.addMonModule)
     
    	def addMonModule(self):
    		self.Layout_Zone.addRow(My_Module())
    		new_widget_size = (self.Widget_Affichage.height()) + 25
    		self.Widget_Affichage.setGeometry(QtCore.QRect(30,30,250,new_widget_size))
     
    if __name__ == "__main__":
    	import sys
    	app = QtWidgets.QApplication(sys.argv)
    	Mon_Interface = QtWidgets.QDialog()
    	ui = Ui_Mon_Interface()
    	ui.setupUi(Mon_Interface)
    	Mon_Interface.show()
    	sys.exit(app.exec_())
    fichier Mon_Module.py ( LineEdit et bouton "-" ):

    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
    # -*- coding: utf-8 -*-
     
    from PyQt5 import QtCore, QtGui
    from PyQt5.QtWidgets import *
     
    increment = 0
     
    class My_Module(QWidget):
    	def __init__(self, parent = None):
    		super(My_Module, self).__init__(parent)
     
    		global increment
     
    		self.lineEdit = QLineEdit()
    		self.lineEdit.setGeometry(QtCore.QRect(40, 70, 320, 25))
    		self.lineEdit.setObjectName("lineEdit"+str(increment))
    		self.lineEdit.setText("Bidule "+str(increment))
     
    		self.delete_btn = QPushButton()
    		self.delete_btn.setGeometry(QtCore.QRect(0,0,30,25))
    		self.delete_btn.setMinimumSize(QtCore.QSize(30, 25))
    		self.delete_btn.setMaximumSize(QtCore.QSize(30, 25))
    		self.delete_btn.setText("-")
     
    		increment +=1
     
    		layout = QHBoxLayout()
    		layout.addWidget(self.lineEdit)	
    		layout.addWidget(self.delete_btn)
    		self.setLayout(layout)
     
    		print(self.lineEdit.objectName())

    En espérant que vous puissiez m'aider
    Merci pour vos réponse

    Bye
    Ben

    P.S : Pour info j'utilise Python 3.3 et PyQt 5

  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,

    Il y a bien sur plusieurs solutions, je t'en montre une qui me parait simple et qui correspond à ton énoncé.

    Le bouton "Add" dans l'interface principale.
    Les group boxes dans une classe séparée
    Les boutons remove dans leur propre group box

    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
     
    # -*- coding: utf-8  -*-
     
    import sys
     
    from PyQt5 import QtGui, QtWidgets
     
    class Main(QtWidgets.QWidget):
        def __init__(self):
            super(Main, self).__init__()
            self.layout = QtWidgets.QVBoxLayout(self)
            self.title = QtWidgets.QLabel("Mes group boxes", self)
            self.layout.addWidget(self.title)
            self.add_btn = QtWidgets.QPushButton("Add", self)
            self.layout.addWidget(self.add_btn)
            self.add_btn.clicked.connect(self.add_group_box)
            self.boxes = []
     
        def add_group_box(self):
            new = GroupBox(len(self.boxes), self)
            self.layout.addWidget(new)
            self.boxes.append(new)
     
        def remove_box(self, box):
            inst = self.boxes[box]
            self.layout.removeWidget(inst)
            self.boxes.remove(inst)
            inst.setParent(None)
     
     
    class GroupBox(QtWidgets.QGroupBox):
        def __init__(self, idx, parent=None):
            super(GroupBox, self).__init__(parent)
            self.index = idx
            self.setTitle('My box %s' % idx)
            self.layout = QtWidgets.QVBoxLayout(self)
            self.remove_btn = QtWidgets.QPushButton("Remove", self)
            self.layout.addWidget(self.remove_btn)
            self.remove_btn.clicked.connect(self.remove_me)
     
        def remove_me(self):
            self.parent().remove_box(self.index)
     
    app = QtWidgets.QApplication([])
    main = Main()
    main.show()
    sys.exit(app.exec_())
    Conseil: efface tous les "setGeometry()" et utilise exclusivement les layouts.


    Edit: Remarque qu'il faudra un moyen moins simpliste d'indexer les groupBox que leur position dans la liste, quand on supprime une box autre que la dernière les indexes des suivantes ne correspondent plus. Ça je te laisse à titre d'exercice.

  3. #3
    bebenc
    Invité(e)
    Par défaut
    Salut,

    Merci pour ta réponse, ça m'apporte déjà pas mal de réponse..

    ça fonctionne presque, j'ai adapté ton code sur mes fichiers et j'ai un problème avec le layout, python cherche mon layout dans le fichier Mon_Module.py alors qu'il est définie dans le fichier Main.py, j'ai essayé un peu près toute les combinaisons possibles pour lui indiquer le bon "chemin" mais rien à faire il arrive pas à le trouver.

    Bye
    Ben

  4. #4
    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
    C'est à dire que dans mon exemple je les ai tous les deux appelés self.layout puisqu'ils sont dans des classes différentes.

    Ce qu'il faut comprendre c'est que le layout de la classe Main sert à aligner les widgets de l'interface dont les groupBox alors que le layout de la classe GroupBox ne sert qu'à aligner les widgets intérieur au dit groupBox.
    Donc tu ne devrais pas à devoir communiquer d'instance de layout d'une classe à l'autre.

    Lorsqu'une fenêtre commence à accumuler (et imbriquer) les layouts, en général, on utilise Qt Designer pour éviter de s'emmêler les pinceaux.

  5. #5
    bebenc
    Invité(e)
    Par défaut
    J'ai oublié de préciser que le problème vient du layout.removeWidget, dans ce cas là le layout correspond bien à mon layout "principal" normalement.

    (Pour la vraie interface j'ai fait ça avec QtDesigner )

  6. #6
    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
    Ah ben non hein, ta fonction de remove doit aussi se trouver dans la classe Main.

    Ta classe GroupBox reçoit simplement référence de Main et lui demandera de procéder à sa suppression, la classe GroupBox ne se supprime pas elle-même.

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

Discussions similaires

  1. [XL-2003] Macro pour supprimer des boutons sauf le premier
    Par Un Internaute dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/09/2014, 16h46
  2. [AC-2007] Bouton pour supprimer des enregistrements
    Par pikamo dans le forum IHM
    Réponses: 5
    Dernier message: 10/01/2012, 20h17
  3. Supprimé des éléments vide d'un tableau
    Par shinux2004 dans le forum Langage
    Réponses: 4
    Dernier message: 04/07/2005, 19h40
  4. Utiliser awk pour supprimer des retours charrios
    Par tomsoyer dans le forum Linux
    Réponses: 3
    Dernier message: 03/01/2005, 18h27
  5. Shell pour supprimer des lignes d'un fichier
    Par nelsa dans le forum Autres langages
    Réponses: 2
    Dernier message: 20/09/2004, 12h26

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