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 :

Reset le layout d'un onglet avec un bouton


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2021
    Messages : 3
    Par défaut Reset le layout d'un onglet avec un bouton
    Bonjour à tous,

    Je suis actuellement en train de coder une petite interface PyQt5 en python et je fait face à un problème.

    Alors voilà, j'ai un onglet QTabWidget() appelé Advanced Acquisition où, quand je clique sur un bouton, tout le layout disparaît pour en afficher un/des nouveaux à partir d'un classe fille Calibration.
    Mon problème est que une fois la calibration terminée j'aimerais cliquer sur un bouton du layout (btnFinish) de la classe Calibration qui pourrais reset l'onglet entier et me réafficher le layout de base.
    Vous trouverez ci-dessous des extrait du code.

    PS: J'en profite pour faire par d'un autre soucis, il se trouve qu'une fois sur 2 quand je run mon programme python restart le noyau et je dois relancer le run pour que ça marche. Je ne comprends pas à quoi c'est dû.

    Merci d'avance.

    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
     
    # -*- coding: utf-8 -*-
    """
    Created on Tue Jul  6 16:44:59 2021
     
    @author: johan
    """
    import PyQt5
    import sys
     
    class AdvancedTab(PyQt5.QtWidgets.QMainWindow):
     
        def __init__(self):
            super().__init__()
            PyQt5.QtWidgets.QMainWindow.__init__(self)
            self.setAttribute(PyQt5.QtCore.Qt.WA_DeleteOnClose)
     
            self.centralWidget = PyQt5.QtWidgets.QWidget(self)
            self.setCentralWidget(self.centralWidget)
     
            self.content()
            self.init()
     
        def content(self):
            text = PyQt5.QtWidgets.QLabel("Main UI")
            text.setFont(PyQt5.QtGui.QFont('Arial',20))
            self.calib = PyQt5.QtWidgets.QPushButton('Make a calibration')
            self.calib.clicked.connect(self.startCalib)
            self.layout0 = PyQt5.QtWidgets.QHBoxLayout()
            self.layout0.addWidget(self.calib)
            self.layout = PyQt5.QtWidgets.QVBoxLayout(self.centralWidget)
            self.layout.addWidget(text)
            self.layout.addLayout(self.layout0)
     
        def init(self):
            self.setLayout(self.layout) #Setting layout
     
        def startCalib(self):
            for i in range(self.layout.count()):
                if self.layout.itemAt(i).layout() is not None :
                    for j in range(self.layout.itemAt(i).count()): self.layout.itemAt(i).itemAt(j).widget().close()
                else:
                    self.layout.itemAt(i).widget().close()
            self.calib=Calibration()
            self.layout.addWidget(self.calib)
     
    class Calibration(AdvancedTab):
     
        def __init__(self):
            super().__init__()
            self.Page1()
     
        def Page1(self):
            self.CloseAll()
            btnAbandon = PyQt5.QtWidgets.QPushButton("Abandon", self)
            btnAbandon.clicked.connect(self.buttonFinish)
            btnNext = PyQt5.QtWidgets.QPushButton("Next", self)
            btnNext.clicked.connect(self.buttonNext1)
     
            self.layout0 = PyQt5.QtWidgets.QHBoxLayout()
            self.layout0.addWidget(btnAbandon)
            self.layout0.addWidget(btnNext)
     
            self.layout.addLayout(self.layout0)
     
        def Page2(self):
            self.CloseAll()
            btnAbandon = PyQt5.QtWidgets.QPushButton("Abandon", self)
            btnAbandon.clicked.connect(self.buttonFinish)
            btnPrevious = PyQt5.QtWidgets.QPushButton("Previous", self)
            btnPrevious.clicked.connect(self.buttonPrevious)
            btnNext = PyQt5.QtWidgets.QPushButton("Next", self)
            btnNext.clicked.connect(self.buttonNext2)
     
            self.layout0 = PyQt5.QtWidgets.QHBoxLayout()
            self.layout0.addWidget(btnAbandon)
            self.layout0.addWidget(btnPrevious)
            self.layout0.addWidget(btnNext)
     
            self.layout.addLayout(self.layout0)
     
        def Page3(self):
            self.CloseAll()
     
            btnRestart1 = PyQt5.QtWidgets.QPushButton("Restart step 1", self)
            btnRestart1.clicked.connect(self.buttonRestart1)
            btnRestart2 = PyQt5.QtWidgets.QPushButton("Restart step 2", self)
            btnRestart2.clicked.connect(self.buttonRestart2)
            btnAbandon = PyQt5.QtWidgets.QPushButton("Abandon", self)
            btnAbandon.clicked.connect(self.buttonFinish)
            btnFinish = PyQt5.QtWidgets.QPushButton("Finish", self) 
            btnFinish.clicked.connect(self.buttonFinish)
     
            self.layout0 = PyQt5.QtWidgets.QHBoxLayout()
            self.layout0.addWidget(btnRestart1)
            self.layout0.addWidget(btnRestart2)
            self.layout1 = PyQt5.QtWidgets.QVBoxLayout()
            self.layout0.addWidget(btnAbandon)
            self.layout0.addWidget(btnFinish)
     
            self.layout.addLayout(self.layout0)
            self.layout.addLayout(self.layout1)
     
        def CloseAll(self):
            for i in range(self.layout.count()):
                if self.layout.itemAt(i).layout() is not None :
                    for j in range(self.layout.itemAt(i).count()):
                        if self.layout.itemAt(i).itemAt(j).layout() is not None :
                            for k in range(self.layout.itemAt(i).itemAt(j).count()):
                                if self.layout.itemAt(i).itemAt(j).itemAt(k).widget() is not None:
                                    self.layout.itemAt(i).itemAt(j).itemAt(k).widget().close()
                        elif self.layout.itemAt(i).itemAt(j).widget() is not None:
                            self.layout.itemAt(i).itemAt(j).widget().close()
                else:
                    self.layout.itemAt(i).widget().close()
     
     
        def buttonNext1(self):
            self.Page2()
     
        def buttonPrevious(self):
            self.Page1()
     
        def buttonNext2(self):
            self.Page3()
     
        def buttonRestart1(self):
            self.Page1()
     
        def buttonRestart2(self):
            self.Page2()
     
        def buttonFinish(self):
            self.CloseAll()
            super().__init__()
            PyQt5.QtWidgets.QMainWindow.update(self)
     
     
    if __name__ == '__main__':
     
        app = PyQt5.QtWidgets.QApplication.instance()
        if not app:
            app = PyQt5.QtWidgets.QApplication(sys.argv)
     
        app.setStyle('Fusion')
     
        f = AdvancedTab()
        f.show()
     
        sys.exit(app.exec_())

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par JohanB38 Voir le message
    Alors voilà, j'ai un onglet QTabWidget() appelé Advanced Acquisition où, quand je clique sur un bouton, tout le layout disparaît pour en afficher un/des nouveaux à partir d'un classe fille Calibration.
    Mon problème est que une fois la calibration terminée j'aimerais cliquer sur un bouton du layout (btnFinish) de la classe Calibration qui pourrais reset l'onglet entier et me réafficher le layout de base.
    Une fonction qui se charge de tout nettoyer puis de re-remplir le layout. Tu peux vider les widgets d'un layout via sa méthode removeWidget().
    Ceci dit, ton code est bien pourri. Dans le constructeur de AdvancedTab tu appelles deux fois le constructeur hérité. Tu donnes à tes layouts plusieurs parents ce qui renvoie un message "QWidget::setLayout: Attempting to set QLayout "" on AdvancedTab "", which already has a layout" (quand on crée des layouts internes on ne leur affecte pas de parent car cela est fait via le addLayout() du layout final et ledit layout final, soit on lui donne un parent à sa création soit on le lui affecte via la méthode setLayout() de la widget destinée à devenir son parent mais on ne fait pas les deux à la fois). Et tes widgets qui héritent d'un objet Qt ne permettent pas de les créer avec les paramètres prévus par l'objet. Par exemple un QMainWindow peut être appelé avec un paramètre "parent" et un paramètre "WindowFlag" mais ton AdvancedTab qui en hérite (donc qui doit offrir les mêmes possibilités) ne peut recevoir lui aucun argument. Tu ne peux même pas lui donner un parent. Or la parenté sous Qt c'est super important !!!

    Voici comment on crée un héritage Qt
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class monTruc(QtTruc):
    	def __init__(self, ..., ... (paramètres spécifiques à mon truc), *args, **kwargs):
    		super().__init_(*args, **kwargs)
    Tu appelles ensuite monTruc() en lui passant les éléments qui lui sont spécifiques et ensuite les éléments attendus par QtTruc qui, eux, seront récupérés par *args et **kwargs et lui seront envoyés tels quels.

    Citation Envoyé par JohanB38 Voir le message
    PS: J'en profite pour faire part d'un autre soucis, il se trouve qu'une fois sur 2 quand je run mon programme python restart le noyau et je dois relancer le run pour que ça marche. Je ne comprends pas à quoi c'est dû.
    Peut-être l'appel à instance() qui ne se justifie pas. Enfin commence par créer un objet Qt plus rigoureux, avec des noms de variable plus explicite que "layout" et "layout0" pour que ça soit plus lisible...
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2021
    Messages : 3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Peut-être l'appel à instance() qui ne se justifie pas. Enfin commence par créer un objet Qt plus rigoureux, avec des noms de variable plus explicite que "layout" et "layout0" pour que ça soit plus lisible...
    Bonjour à toi,

    Déjà merci beaucoup d'avoir regardé le code et pris le temps de répondre.

    Cependant, je dois t'avouer que je ne comprends pas tout ce dont tu m'as parlé. C'est la première fois que je touche à la librairie Qt et aux interfaces sur python et quand tu me dis que mes layouts ont plusieurs parents ou qu'AdvancedTab ne peux recevoir d'argument je ne suis pas sur de comprendre.

    Je crée mon layout avec QVBoxLayout(self.centralWidget) puis je lui ajoute des élements (Widgets ou Layouts) et ensuite je set le layout de ma fenêtre avec le layout créé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    self.layout = PyQt5.QtWidgets.QVBoxLayout(self.centralWidget) #Creating Layout
     
    #Adding widgets and layouts
    self.layout.addLayout(sous_layout1)
    self.layout.addWidget(self.btn)
    self.layout.addLayout(sous_layout2)
     
     
    self.setLayout(self.layout) #Setting layout
    Cette méthode est-elle fausse ? et si oui pourquoi ? (sachant que je n'ai jamais eu d'erreur ou de message quelconque concernant ces lignes)

    Ensuite tu ne réponds pas vraiment à ma question car j'arrive déjà à nettoyer mon layout avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for i in range(self.layout.count()):
                if self.layout.itemAt(i).layout() is not None :
                    for j in range(self.layout.itemAt(i).count()):
                        if self.layout.itemAt(i).itemAt(j).layout() is not None :
                            for k in range(self.layout.itemAt(i).itemAt(j).count()):
                                if self.layout.itemAt(i).itemAt(j).itemAt(k).widget() is not None:
                                    self.layout.itemAt(i).itemAt(j).itemAt(k).widget().close()
                        elif self.layout.itemAt(i).itemAt(j).widget() is not None:
                            self.layout.itemAt(i).itemAt(j).widget().close()
                else:
                    self.layout.itemAt(i).widget().close()
    Je considère que la fonction removeWidget() ne suffit pas étant donné que les layouts n'ont pas toujours les mêmes widgets et qu'il y a des layout imbriqués...

    Mon réel problème est qu'après avoir nettoyer mon layout à la fin de ma calibration j'aimerais retrouver le layout de base de l'onglet AdvancedTab.

    PS : Je comprends que le code soit diffcile à interpréter et je pense que c'est essentiellement dû au fait que ce n'est que la partie emergée de l'iceberg (et encore avec des morceaux manquants) ; pour te donner une idée tu ne vois qu'une centaines de lignes sur plus d'1 millier au total et en réalité AdvancedTab fait 400 lignes et pas 40.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JohanB38 Voir le message
    Cependant, je dois t'avouer que je ne comprends pas tout ce dont tu m'as parlé. C'est la première fois que je touche à la librairie Qt et aux interfaces sur python
    Ah oui mais si tu veux courir avant d'avoir appris à marcher, tu te scratches...

    Citation Envoyé par JohanB38 Voir le message
    et quand tu me dis que mes layouts ont plusieurs parents ou qu'AdvancedTab ne peux recevoir d'argument je ne suis pas sur de comprendre.
    Ok, bases de l'héritage
    Un héritage c'est (grosso-modo) récupérer une classe existante mais lui rajouter des trucs persos. Toutefois, le rajout des trucs persos ne doit pas se faire au détriment des trucs de la classe d'origine.

    Si par exemple j'ai un objet "vehicule" qui prend en paramètre une vitesse max...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class vehicule:
    	def __init__(self, vMax):
    		self.vMax=vMax
    v1=vehicule(200)
    print(v1.vMax)

    ...et que je crée un objet "voiture" qui hérite de "vehicule", cet objet voiture, en plus de ses éléments persos comme par exemple la marque, doit aussi permettre de créer le véhicule dont il hérite. Donc doit recevoir lui-aussi une vMax en paramètre, vMax qu'il passe à la classe dont il hérite...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class voiture(vehicule):
    	def __init__(self, marque, vMax):
    		super().__init__(vMax)
    		self.marque=marque
     
    v2=voiture("Lada", 10)
    print(v2.vMax)
    ... sinon l'héritage ne peut pas se faire.

    Ceci semble alors assez rébarbatif (devoir répertorier tous les paramètres nécéssaires à l'obet de base pour les répercuter dans son propre objet). Sauf que Python possède un outil de paramétrage spécial: le tuple "*args" et le dictionnaire "**kwargs". Ces deux paramètres spéciaux qu'on place toujours à la fin (enfin *args peut maintenant être placé n'importe où depuis Python3 mais toujours avant **kwargs) récupèrent automatiquement tous les éléments qui n'ont pas été récupérés par un paramètre précédent. Donc quand on crée un héritage, il suffit de rajouter à ses propres paramètres spécifiques ces deux paramètres "généraux" et les passer tels quels au parent. Ces paramètres "généraux" récupèrent automatiquement ceux qui ne sont pas récupérés par notre objet et les envoient au parent qui peut alors les utiliser...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class voiture(vehicule):
    	def __init__(self, marque, *args, **kwargs):
    		super().__init__(*args, **kwargs)
    		self.marque=marque
     
    v2=voiture("Lada", 10)
    print(v2.vMax)
    ... ainsi pas besoin de se taper la doc de "vehicule" pour savoir ce dont il a besoin. Et c'est pareil donc avec tout héritage, y compris un héritage d'un objet Qt.

    Citation Envoyé par JohanB38 Voir le message
    Cette méthode est-elle fausse ? et si oui pourquoi ?
    La parenté sous Qt est un élément super important. C'est la parenté entre par exemple un bouton et le widget où il est rattaché qui fait que si le widget devient invisible, le bouton devient lui-aussi invisible. Donc quand on crée un élément de travail Qt (exemple un QLabel) dans un widget plus global, on indique ce widget comme parent du QLabel
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    w=QWidget(...)
    lab=QLabel("Hello", parent=w)

    Toutefois en cas de layouts imbriqués, cette règle ne s'applique pas pour les layouts internes qui, eux, sont créés sans parent (me demande pas pourquoi j'en sais rien). Donc si par exemple je veux mettre 2 labels et en dessous 2 boutons et tout ça dans une widget plus générale, voici comment ça peut se faire
    Code python : 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
    w=QWidget(...)
     
    lab1=QLabel("Hello", parent=w)
    lab2=QLabel("World", parent=w)
    # Les labels placés horizontalement
    layoutLab=QHBoxLayout()
    layoutLab.addWidget(lab1, 1)
    layoutLab.addWidget(lab2, 1)
     
    btn1=QPushButton("Hello", parent=w)
    btn2=QPushButton("World", parent=w)
    # Les boutons placés horizontalement
    layoutBtn=QHBoxLayout()
    layoutBtn.addWidget(btn1, 1)
    layoutBtn.addWidget(btn2, 1)
     
    # Les deux ensembles placés verticalement
    layoutWid=QVBoxLayout(parent=w)
    layoutWid.addLayout(layoutLab, 1)
    layoutWid.addLayout(layoutBtn, 0)
    Les layouts internes ne doivent pas être créés avec un parent car c'est le addLayout() qui positionne le parent. Et si on le fait quand-même, Qt indique qu'il ne peut pas attribuer deux fois un parent à un layout (le message de mon post précédent). Toutefois pour le layoutWid (le layout global qui récupère tous les autres) lui il doit avoir la widget comme parent. Ceci dit ce n'est pas obligatoire de l'écrire ainsi. On peut très bien créer le layout global sans parent et le positionner plus tard via setLayout()
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    w=QWidget(...)
    ...
    # Les deux ensembles placés verticalement
    layoutWid=QVBoxLayout()
    layoutWid.addLayout(layoutLab, 1)
    layoutWid.addLayout(layoutBtn, 0)
     
    # La widget devient parente du layout principal
    w.setLayout(layoutWid)
    Sauf qu'on peut utiliser une méthode ou l'autre, mais pas les deux sinon là encore Qt râle en disant qu'on ne peut pas positionner deux fois un parent sur un layout qui en a déjà un.

    Citation Envoyé par JohanB38 Voir le message
    (sachant que je n'ai jamais eu d'erreur ou de message quelconque concernant ces lignes)
    Le message apparait dans la console d'où est lancé le programme (sous-entendu que comme moi tu es sous un Linux et que tu lances ton programme via une ligne de commande). Si t'es sous zindow et que tu double-cliques sur le Python pour l'exécuter, pas de console donc pas de message (ce qui n'empêche pas le souci d'exister). Tu peux aussi sous Windows avoir la console: suffit d'ouvrir une fenêtre MsDos et lancer le programme manuellement via python pgm.py.

    Citation Envoyé par JohanB38 Voir le message
    Ensuite tu ne réponds pas vraiment à ma question car j'arrive déjà à nettoyer mon layout avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for i in range(self.layout.count()):
                if self.layout.itemAt(i).layout() is not None :
                    for j in range(self.layout.itemAt(i).count()):
                        if self.layout.itemAt(i).itemAt(j).layout() is not None :
                            for k in range(self.layout.itemAt(i).itemAt(j).count()):
                                if self.layout.itemAt(i).itemAt(j).itemAt(k).widget() is not None:
                                    self.layout.itemAt(i).itemAt(j).itemAt(k).widget().close()
                        elif self.layout.itemAt(i).itemAt(j).widget() is not None:
                            self.layout.itemAt(i).itemAt(j).widget().close()
                else:
                    self.layout.itemAt(i).widget().close()
    Ok, tu arrives à nettoyer le layout. Toutefois si tu veux re-remplir le layout de base, la meilleure des solutions est de créer une fonction spécifique pour le remplir et d'appeler cette fonction (c'est ça le but des fonctions, factoriser un code pour pouvoir le réutiliser plus facilement)

    Citation Envoyé par JohanB38 Voir le message
    Mon réel problème est qu'après avoir nettoyer mon layout à la fin de ma calibration j'aimerais retrouver le layout de base de l'onglet AdvancedTab.
    Oui mais Qt c'est pas de la magie. Tu veux retrouver ce que tu avais au début tu dois recréer le layout du début (d'où la méthode de passer par une fonction). Tu peux aussi ruser. Créer par exemple deux widgets, la première qui contient l'affichage1, la seconde qui contient l'affichage2, et ensuite cacher la première et afficher la seconde et inversement selon les situations.
    Ceci dit, j'ai tenté au début moi aussi de faire apparaitre des trucs quand c'est nécessaire et les faire disparaitre quand cela ne l'est plus mais les utilisateurs n'aiment pas ça. Ils ont l'impression que le programme a des bugs. J'ai alors opté pour des éléments toujours visibles mais que je grise et dégrise (setDisabled()/setEnabled()) selon le cas.
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2021
    Messages : 3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ah oui mais si tu veux courir avant d'avoir appris à marcher, tu te scratches...
    Salut,

    Saches que tout ton message m'a été d'une grande aide et m'a ouvert les yeux sur pas mal de choses dans mon code. Merci infiniment !

    Avec les conseils que tu m'as donné et les possibilités que j'ai au sein de mon projet, je pense à présent pouvoir me débrouiller et faire quelque chose d'assez robuste.

    Je considère mon problème résolu et je te remercie grandement pour le temps que tu m'as consacré.

    Bonne continuation.

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

Discussions similaires

  1. [XL-2007] Copie d'onglet avec des bouton dans un fichier .xls
    Par xdupart dans le forum Excel
    Réponses: 4
    Dernier message: 12/03/2015, 10h07
  2. Onglet avec calques HTML/CSS
    Par Looping2605 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 07/02/2006, 21h27
  3. [VB.Net] Faire des onglets avec Webmatrix
    Par ellyne dans le forum ASP.NET
    Réponses: 2
    Dernier message: 16/01/2006, 12h03
  4. onglet avec calque
    Par cloeuf dans le forum Balisage (X)HTML et validation W3C
    Réponses: 17
    Dernier message: 12/01/2006, 14h16
  5. Creer onglet avec forms9
    Par simpletz dans le forum Forms
    Réponses: 5
    Dernier message: 10/08/2005, 12h46

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