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 :

Etirer une image sur la toute la largeur de la GUI [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 436
    Points : 109
    Points
    109
    Par défaut Etirer une image sur la toute la largeur de la GUI
    Bonjour,

    J'ai intégré dans mon GUI une image, mais le problème est qu'elle est fixe et non dynamique (ne s'adapte pas en temps réel à la taille de la fenêtre).

    Auriez-vous des suggestions?

    Voici mon code:
    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
     
    from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QGroupBox, QDialog, QVBoxLayout, QLabel
    from PyQt5.QtCore import QSettings
    import sys
    from PyQt5.QtGui import QIcon, QPixmap
     
    class Example(QWidget):
     
        def __init__(self):
            super().__init__()      
            self.initUI()
     
        def initUI(self):      
            settings=QSettings('ini/application.ini',QSettings.IniFormat);
            APPLICATION_NAME=settings.value("GLOBAL_PARAMETERS/APPLICATION_NAME")
            self.setWindowIcon(QIcon('ini/graph.ico'))
     
            LabelForBandeau = QLabel(self)
            BandeauPicture = QPixmap('ini/bandeau.jpg')
            LabelForBandeau.setPixmap(BandeauPicture)
     
            self.setWindowTitle(APPLICATION_NAME)
            self.showMaximized()
     
    if __name__ == '__main__':
     
        app = QApplication(sys.argv)
        app.setStyle('Fusion')
        ex = Example()
        sys.exit(app.exec_())
    Merci par avance pour vos retour.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il y a 2 choses à faire:

    1- faire en sorte que l'image prenne tout l'espace disponible du QLabel, avec sa méthode .setScaledContents(True)

    2- faire en sorte que le QLabel prenne tout l'espace disponible du widget dans lequel il se trouve avec un QGridLayout.

    Voilà une petite modif simplifié de ton code:

    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
    # -*- coding: utf-8 -*-
    # Python 3
     
    import sys
    from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QHBoxLayout, 
                            QGroupBox, QDialog, QVBoxLayout, QLabel, QGridLayout)
    from PyQt5.QtGui import QIcon, QPixmap
     
    class Example(QWidget):
     
        def __init__(self):
            super().__init__()      
            self.initUI()
     
        def initUI(self):      
            self.setWindowTitle("APPLICATION_NAME")
     
            BandeauPicture = QPixmap('tux.jpg')
            self.LabelForBandeau = QLabel(self)
            # l'image prendra tout l'espace du QLabel:
            self.LabelForBandeau.setScaledContents(True)
            self.LabelForBandeau.setPixmap(BandeauPicture)
     
            # positionne le QLabel dans la fenêtre QWidget
            posit = QGridLayout()
            posit.addWidget(self.LabelForBandeau, 0, 0)
            self.setLayout(posit)
     
            self.show()
            #self.showMaximized()
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        app.setStyle('Fusion')
        ex = Example()
        sys.exit(app.exec_())
    Mais, bien sûr, cette solution déforme l'image en fonction du redimensionnement de la fenêtre. Si tu souhaites autre chose, il faut adapter la solution QGridLayout.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 436
    Points : 109
    Points
    109
    Par défaut
    Ok, merci mais je ne suis vraiment pas familié avec PyQT5, c'est beaucoup plus compliquer que tkinter...

    Par contre, si je peux abuser, comment fait-on juste pour la largeur et non la hauteur?

    Merci

  4. #4
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 436
    Points : 109
    Points
    109
    Par défaut
    En fait j'ai trouvé ça comme code sur le net qui m'interesse, je voudrais juste ajouter au dessus des tab une image 'bandeau' sur toute la largeur... et par la suite une statusbar...

    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
     
     
    import sys
    from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QWidget, QAction, QTabWidget,QVBoxLayout
    from PyQt5.QtGui import QIcon
    from PyQt5.QtCore import pyqtSlot
     
    class App(QMainWindow):
     
            def __init__(self):
                    super().__init__()
                    self.title = 'PyQt5 tabs - pythonspot.com'
                    self.left = 0
                    self.top = 0
                    self.width = 300
                    self.height = 200
                    self.setWindowTitle(self.title)
                    self.setGeometry(self.left, self.top, self.width, self.height)
     
                    self.table_widget = MyTableWidget(self)
                    self.setCentralWidget(self.table_widget)
     
                    self.show()
     
    class MyTableWidget(QWidget):
     
            def __init__(self, parent):
                    super(QWidget, self).__init__(parent)
                    self.layout = QVBoxLayout(self)
     
                    # Initialize tab screen
                    self.tabs = QTabWidget()
                    self.tab1 = QWidget()
                    self.tab2 = QWidget()
                    self.tabs.resize(300,200)
     
                    # Add tabs
                    self.tabs.addTab(self.tab1,"Tab 1")
                    self.tabs.addTab(self.tab2,"Tab 2")
     
                    # Create first tab
                    self.tab1.layout = QVBoxLayout(self)
                    self.pushButton1 = QPushButton("PyQt5 button")
                    self.tab1.layout.addWidget(self.pushButton1)
                    self.tab1.setLayout(self.tab1.layout)
     
                    # Add tabs to widget
                    self.layout.addWidget(self.tabs)
                    self.setLayout(self.layout)
     
                    @pyqtSlot()
                    def on_click(self):
                            print("\n")
                            for currentQTableWidgetItem in self.tableWidget.selectedItems():
                                    print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text())
     
    if __name__ == '__main__':
            app = QApplication(sys.argv)
            app.setStyle('Fusion')
            ex = App()
            sys.exit(app.exec_())

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ce dernier code n'est pas très bon. Je t'en propose une autre écriture plus simple:

    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 -*-
    # Python 3
     
    import sys
    from PyQt5.QtWidgets import (QMainWindow, QApplication, QWidget, QTabWidget, 
                                 QLabel, QFrame, QGridLayout)
    from PyQt5.QtGui import QIcon, QPixmap
    from PyQt5.QtCore import pyqtSlot
     
    class App(QMainWindow):
     
        def __init__(self):
            super().__init__()
     
            self.setWindowTitle('PyQt5 tabs')
            self.resize(300, 200)
     
            # création du bandeau de 50 pixels de haut
            BandeauPicture = QPixmap('tux.jpg')
            self.bandeau = QLabel(self)
            self.bandeau.setFixedHeight(50)
            self.bandeau.setScaledContents(True)
            self.bandeau.setPixmap(BandeauPicture)
     
            # création d'un QTabWidget avec 2 onglets
            self.tabwidget = QTabWidget(self)
            self.tab1 = QWidget() # widget de l'onglet tab1
            self.tab2 = QWidget() # widget de l'onglet tab2
            self.tabwidget.addTab(self.tab1,"Tab 1")
            self.tabwidget.addTab(self.tab2,"Tab 2")
     
            # Affichage d'un message sur la barre de status
            self.statusBar().showMessage("Message de status")
     
            # positionnement des widgets dans la fenêtre QMainWindow
            self.setCentralWidget(QFrame())
            layout = QGridLayout()
            layout.addWidget(self.bandeau, 0, 0) # bandeau en haut
            layout.addWidget(self.tabwidget, 1, 0) # QTabWidget en bas
            self.centralWidget().setLayout(layout)
     
    if __name__ == '__main__':
            app = QApplication(sys.argv)
            app.setStyle('Fusion')
            ex = App()
            ex.show()
            sys.exit(app.exec_())
    Pour que le label apparaisse avec une hauteur donnée, il suffit de forcer la hauteur avec setFixedHeight(50) pour 50 pixels.

    Il ne faut pas faire de confusion entre un QTabWidget (un widget avec des onglets) et un QTableWidget (un widget de type tableur). Par exemple, la méthode "selectedItems" citée dans on_click existe dans un QTableWidget, mais pas dans un QTabWidget.

    J'ai positionné le QLabel du bandeau (en haut) et le QTabWidget (en bas) avec un QGridLayout pour que les 2 suivent bien les éventuels redimensionnements de la fenêtre.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 436
    Points : 109
    Points
    109
    Par défaut
    Merci c'est PARFAIT!!

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

Discussions similaires

  1. [WD-2016] Importer une image sur toutes les pages d'un document word (VBA)
    Par fossi69 dans le forum VBA Word
    Réponses: 3
    Dernier message: 21/12/2017, 09h09
  2. [PPT-2007] Insertion d'une image sur toute les slides.
    Par kahoerre dans le forum VBA PowerPoint
    Réponses: 4
    Dernier message: 09/06/2012, 06h43
  3. Réponses: 2
    Dernier message: 20/08/2010, 10h28
  4. Etendre une image sur toute la page
    Par Koganei dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 20/11/2008, 11h52
  5. afficher une image sur toute la fenêtre
    Par argon dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 18/02/2006, 09h44

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