尝试将 QLabel 的文本设置为 class 对象的 __repr__ 并出现错误

Trying to set the text of a QLabel as the __repr__ of a class's object and getting an error

我试图根据用户在组合框中选择的内容更改 QLabel 中的文本,我想设置的文本是 class 的 __repr__ 函数。这是我用来尝试做我想做的事情的代码:

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Resonant Orbit Calculator")
        self.setMinimumSize(QSize(500, 400))

        m_label = QLabel()
        m_label.setText(object)

        c_box = QComboBox()
        c_box.addItems(planet.name for planet in planets_objects)
        c_box.addItems(moon.name for moon in moons_objects)

        c_box.currentTextChanged.connect(self.text_changed)

        layout = QVBoxLayout()
        layout.addWidget(m_label)
        layout.addWidget(c_box)

        widget = QWidget()
        widget.setLayout(layout)

        self.setCentralWidget(widget)

    def text_changed(self, t):
        for element in planets_objects + moons_objects:
            if element.name == t:
                object = element
                break
        print(object)

        return object

我得到的错误是 TypeError: setText(self, str): argument 1 has unexpected type 'type'。我有点明白我使用了错误的信息来将 QLabel 设置为,但我不知道该怎么做。

错误很少。

  1. object 在 Python 中是特殊的 object/class,您不应该将它用作变量。

  2. 您在 __init__ 中使用 setText(object) 但您从未将文本分配给变量 object

  3. 您应该在 self.m_label 中使用 self. 才能在其他功能中访问此小部件。

  4. 在其他函数中,您必须使用 setText(..) 来更改标签中的文本。您不能通过将新文本分配给变量 object

    来更改它

如果您需要 __repr__ 的结果,请使用 repr(...)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Resonant Orbit Calculator")
        self.setMinimumSize(QSize(500, 400))

        self.m_label = QLabel()
        self.m_label.setText('Default text on start')

        c_box = QComboBox()
        c_box.addItems(planet.name for planet in planets_objects)
        c_box.addItems(moon.name for moon in moons_objects)

        c_box.currentTextChanged.connect(self.text_changed)

        layout = QVBoxLayout()
        layout.addWidget(m_label)
        layout.addWidget(c_box)

        widget = QWidget()
        widget.setLayout(layout)

        self.setCentralWidget(widget)

    def text_changed(self, selected):
        for element in planets_objects + moons_objects:
            if element.name == selected:
                #self.m_label.setText(element)
                self.m_label.setText(repr(element))
                break
                # OR
                #return

顺便说一句:text_changedPyQt 执行,但它不知道如何处理返回值 - 所以使用 return object 是无用的。