【问题标题】:Dynamically created labels won't display on the screen pyqt5 [duplicate]动态创建的标签不会显示在屏幕上pyqt5 [重复]
【发布时间】:2020-06-01 17:43:45
【问题描述】:

我正在使用 PyQt5 制作一个基本的 GUI 应用程序,并且需要在用户输入后动态创建 labels。现在,问题是它们不会显示在屏幕上,尽管对象本身是创建的。用户完成输入后,按下按钮时会调用此函数:

def set_result_labels(self):
        font = QtGui.QFont()
        font.setPointSize(15)
        for i in range(len(self.text_parties_names)):
            label = QtWidgets.QLabel(self.centralwidget)
            setattr(self, f"label_{i+5}", label)
            label.setGeometry(QtCore.QRect(700, (100+4*i), 50, 50))
            label.setFont(font)
            label.setText(self.text_parties_names[i])
            label.setObjectName(f"label_{i+5}") 

但是,如果我“明确地”创建它们,像这样:

        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(600, 400, 171, 40))
        self.label_5.setFont(font)
        self.label_5.setText(self.text_parties_names[0])
        self.label_5.setObjectName("label_25")

它可以正常工作。我不明白为什么。

【问题讨论】:

  • 我现在只能猜测,但也许每个循环都覆盖label 变量不是一个好主意。尝试将所有标签保存在一个列表中
  • 添加label.show()
  • @eyllanesc 实际上这解决了问题,我不敢相信。谢谢

标签: python-3.x pyqt5


【解决方案1】:

作为一个选项,您可以在layout 中插入label,例如:

import sys
from PyQt5 import QtWidgets, QtGui, QtCore


class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        button = QtWidgets.QPushButton("Button")
        button.clicked.connect(self.set_result_labels)

        scrollArea = QtWidgets.QScrollArea()
        widget = QtWidgets.QWidget()
        scrollArea.setMinimumWidth(200)
        scrollArea.setMinimumHeight(200)
        scrollArea.setWidget(widget)
        scrollArea.setWidgetResizable(True)
        scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.scroll_box = QtWidgets.QVBoxLayout(widget)

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(scrollArea) 
        layout.addStretch(1)  
        layout.addWidget(button)  

        self.text_parties_names = '12345'

    def set_result_labels(self):
        font = QtGui.QFont()
        font.setPointSize(15)
        for i in range(len(self.text_parties_names)):
            label = QtWidgets.QLabel()
            setattr(self, f"label_{i+5}", label)
#            label.setGeometry(QtCore.QRect(700, (100+4*i), 50, 50))
            label.setFont(font)
            label.setText(self.text_parties_names[i])
            label.setObjectName(f"label_{i+5}") 

            self.scroll_box.addWidget(label)                                # <<<---


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

【讨论】:

  • @eyllanesc 建议有效,但我也喜欢你的方法。我是 PyQt5 的新手,你提出了一个好主意。
  • @kaktus_car 选择永远是你的 :)
猜你喜欢
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多