PyQt5: QLabel
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) ...
Commenti recenti