Home > PyQt5, python > PyQt5: QLabel

PyQt5: QLabel

13 Marzo 2019

Torna all’indice degli appunti

Sulle Label non è che ci sia molto da dire.
Il costruttore è QLabel(text).
In fase di creazione il testo può anche essere omesso e poi aggiunto in seguito con il metodo setText.
Con il metodo text si ottiene il testo della label.

>>> from PyQt5.QtWidgets import QApplication, QLabel
>>> app = QApplication([])
>>> label = QLabel()
>>> label.setText("Some text")
>>> label.text()
'Some text'

I parametri da passare al costruttore sono: il testo da mostrare e il parent widget.

Dimensione widget

E’ possibile modificare la geometria della label (e di molti widgets) con il metodo setGeometry,
che prende in ingresso un oggetto QRect(left_point_x, left_point_y, right_point_x, right_point_y):

from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QFrame
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import QRect
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QButton Example")
        self.central_widget = FormWidget(self)
        self.setCentralWidget(self.central_widget)
        self.resize(300, 200)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        label1 = QLabel("setFixedSize", self)
        label1.setGeometry(QRect(50, 100, 200, 20))
        self.set_border(label1)

    @staticmethod
    def set_border(label):
        label.setFrameShape(QFrame.Panel)
        label.setFrameShadow(QFrame.Sunken)
        label.setLineWidth(2)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

Nota:

Le seguenti linee di codice servono semplicemente a dare un contorno alle label per distinguere più chiaramente le differenze negli assegnamenti.

    @staticmethod
    def set_border(label):
        label.setFrameShape(QFrame.Panel)
        label.setFrameShadow(QFrame.Sunken)
        label.setLineWidth(2)

Nota:

Quando si inserisce il widget all’interno di un QBoxLayout, questi segue le policy di quest’ultimo.

...
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        label1 = QLabel("setFixedSize", self)
        label1.setGeometry(QRect(50, 100, 200, 20))
        self.set_border(label1)
        layout.addWidget(label1)
        self.setLayout(layout)
...

E’ possibile definire delle dimensioni fisse con il metodosetFixedSize(size_x, size_y):

...
        label1 = QLabel("setFixedSize", self)
        label1.setFixedSize(70, 30)
        self.set_border(label1)  # Add border and shadow
        layout.addWidget(label1, 0)
        self.setLayout(layout)
...

E’ possibile anche definire le misure minime fisse in caso di ridimensionamento della finestra:

setMinimumSize: blocchiamo entrambe le dimensioni del widget in caso di riduzione della finestra che lo ospita;
setMinimumHeight: blocchiamo le dimensioni del widget in Y, in caso di riduzione della finestra;
setMinWidth: blocchiamo le dimensioni del widget in X, in caso di riduzione della finestra;

L’efficacia dei comandi la si può notare nel momento in cui si riduce la finestra principale, poichè le misure fissate dei
widget, diventano bloccanti!

...
        layout = QBoxLayout(QBoxLayout.TopToBottom)

        label1 = QLabel("setMinimumHeight", self)
        label1.setMinimumHeight(100)
        self.set_border(label1)
        layout.addWidget(label1, 0)

        label2 = QLabel("setMinimumWidth", self)
        label2.setMinimumWidth(150)
        self.set_border(label2)
        layout.addWidget(label2, 0)

        label3 = QLabel("setMinimumSize", self)
        label3.setMinimumSize(150, 150)
        self.set_border(label3)
        layout.addWidget(label3, 0)

        self.setLayout(layout)
...

I metodi per fissare le dimensioni dei widget nei valori massimi sono invece:

setMaximumSize: blocchiamo entrambe le dimensioni del widget in caso di ingrandimento del frame che lo ospita;
setMaximumHeight: blocchiamo le dimensioni del widget in Y, in caso di ingrandimento della finestra;
setMaxWidth: blocchiamo le dimensioni del widget in X, in caso di ingrandimento della finestra;

...
        label1 = QLabel("setMaximumHeight", self)
        label1.setMaximumHeight(100)
        self.set_border(label1)
        layout.addWidget(label1, 0)

        label2 = QLabel("setMaximumWidth", self)
        label2.setMaximumWidth(150)
        self.set_border(label2)
        layout.addWidget(label2, 0)

        label3 = QLabel("setMaximumSize", self)
        label3.setMaximumSize(150, 150)
        self.set_border(label3)
        layout.addWidget(label3, 0)

        self.setLayout(layout)
...

Allineamento testo orizzontale

E’ gestito dalle costanti:

Qt.AlignLeft: allineamento testo a sinistra
Qt.AlignHCenter: testo al centro della label
Qt.AlignRight: allineamento testo a destra
Qt.AlignJustify: testo giustificato

Allineamento testo verticale

E’ gestito dalle costanti:

Qt.AlignTop: allineamento testo in alto
Qt.AlignVCenter: testo al centro dell’asse verticale
Qt.AlignBottom: allineamento testo in basso
Qt.AlignBaseLine: testo giustificato

from PyQt5.QtWidgets import QWidget, QApplication, QBoxLayout, QLabel, QFrame
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import Qt
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QButton Example")
        self.central_widget = FormWidget(self)
        self.setCentralWidget(self.central_widget)
        self.resize(200, 100)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        self.setLayout(layout)

        for text, align in [
            ("Align Left", Qt.AlignLeft), ("Align H Center", Qt.AlignHCenter),
            ("Align Right", Qt.AlignRight), ("Align Justify", Qt.AlignJustify),
            ("Align Top", Qt.AlignTop), ("Align V Center", Qt.AlignVCenter),
            ("Align Bottom", Qt.AlignBottom), ("Align BaseLine", Qt.AlignBaseline),
             ]:
            label = QLabel(text, self)
            label.setMinimumHeight(50)
            label.setAlignment(align)

            label.setFrameShape(QFrame.Panel)
            label.setFrameShadow(QFrame.Sunken)
            label.setLineWidth(2)
            layout.addWidget(label, 0)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

Vediamo visivamente le differenze

E’ ovviamente possibile unire più allineamenti tramite pipe, ad es. centrare il testo sia orizzontalmente che
verticalmente:

...
        label = QLabel("Align center H and V ", self)
        label.setMinimumHeight(50)
        label.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        label.setFrameShape(QFrame.Panel)
        label.setFrameShadow(QFrame.Sunken)
        label.setLineWidth(2)
        layout.addWidget(label, 0)
...

Colore

Come per gli altri widget è ovviamente possibile dare una differente colorazione alla label utilizzando QColor e QPalette:

...
from PyQt5.QtGui import QColor
...
        label = QLabel("Some text", self)
        label.setMinimumHeight(50)
        # Color
        palette = label.palette()
        background = label.backgroundRole()
        foreground = label.foregroundRole()
        palette.setColor(background, QColor('Yellow'))
        palette.setColor(foreground, QColor('Red'))
        label.setPalette(palette)
        label.setAutoFillBackground(True)
        
        layout.addWidget(label, 0)
        self.setLayout(layout)
...

Modificare Font

Per modificare il font di una label utilizziamo QFont.
Questo costruttore prende in ingresso gli argomenti nome del font, dimensione, e tipo di font (grassetto, ecc..).
Una volta creato un oggetto font si associa alla label con il metodo setFont:

...
from PyQt5.QtGui import QFont
...
        label = QLabel("some text", self)
        font = QFont("Lucida", 14, QFont.Bold)
        label.setFont(font)

        layout.addWidget(label, 0)
        self.setLayout(layout)
...

Immagini

Per inserire un’immagine nella label, si utilizza il costruttore QMixMap.

...
from PyQt5.QtGui import QPixmap

...
        label = QLabel(self)
        pixmap = QPixmap('qt.jpg')
        label.setPixmap(pixmap)
        layout.addWidget(label, 0)
        self.setLayout(layout)
...

External Link

Vediamo come associare un link ad una label e connettere un segnale che apra tale link con il browser.
Il pyqtSignal da utilizzare è linkActivated:

...
import subprocess


...
        label = QLabel('<a href="www.google.com">Find something</a>')
        label.linkActivated.connect(self.on_activate)

        layout.addWidget(label, 0)
        self.setLayout(layout)

    def on_activate(self, link):
        print("INFO: link %s opening..." % link)
        subprocess.call(['C:\\Program Files\\Mozilla Firefox\\firefox.exe',
                         link])
...

Una volta cliccato sul testo, si aprirà il browser alla pagina desiderata.

Testo selezionabile

Si utilizza semplicemente il metodo setTextInteractionFlags(Qt.TextSelectableByMouse), che permette di selezionare con il mouse il testo della lable e copiarlo.

...
from PyQt5.QtCore import Qt

...
        label = QLabel('<a href="www.google.com">Find something</a>')
        label.setTextInteractionFlags(Qt.TextSelectableByMouse)
        layout.addWidget(label, 0)
        self.setLayout(layout)
...

Testo su più righe

Se vogliamo che, durante la riduzione della finestra principale, il testo della label si disponga automaticamente su più righe, a seconda dell’esigenza, possiamo utilizzare il metodo setWordWrap(True).

...
        label = QLabel('This is a long long long text')
        label.setWordWrap(True)
...

Torna all’indice degli appunti

Categorie:PyQt5, python Tag: ,
I commenti sono chiusi.