Я новичок в PyQt и делаю небольшое приложение, похожее на чат. Я инициализировал графический интерфейс и создал несколько методов для управления вводом данных пользователем. Проблема в том, что я не могу использовать инструкцию self.Method (), как показано в учебных пособиях в сети. По какой-то причине Python сообщает мне, что объект не имеет атрибута 'WIDGET', где WIDGET в данном случае - это QListWidget.

Мне удалось преодолеть это с помощью findChild, но я не уверен, что это правильный способ сделать это. Как правильно получить доступ к виджетам из метода PyQt?

Вот мой код:

import stuff *
class ASIMOV(QWidget):
        def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        QToolTip.setFont(QFont('SansSerif', 12))

        botLog = QListWidget(self)
        botLog.resize(150, 150)

        botInput = QLineEdit(self)
        botInput.returnPressed.connect(self.handleChatInput)

        vbox = QVBoxLayout()
        vbox.addWidget(botLog)
        vbox.addWidget(botInput)

        self.setLayout(vbox)
        self.resize(600, 400)
        self.show()

    def startChat(self, botLog):
        u = ASIMOV_user.User()
        #Greet user
        botLog.addItem('#: Hey there' + u.getName())
        botChat = ASIMOV_chat.Chat()

    def handleChatInput(self):
        u = ASIMOV_user.User()
        print(self.botLog.text())
        botInput = self.findChild(QLineEdit, "")
        botLog = self.findChild(QListWidget, "")
        #lineEdits = self.findChildren(QLineEdit)
        botLog.addItem('#' + u.getName() + ': ' + botInput.text())
        #print(botInput.text())

if __name__=="__main__":
    app = QApplication(sys.argv)
    w = ASIMOV()
    sys.exit(app.exec_())

Кроме того, должен ли я инициализировать класс каждый раз, когда я хочу получить доступ к его методу, например к геттерам из класса ASIMOV_user?

rasa911216

Ответов: 1

Ответы (1)

Ответ дал three_pineapples. В этом случае в исходном коде виджеты объявлены без оператора self, который делает их локальными элементами.

Как он описал, требуется только добавить self.WIDGET, чтобы сделать их доступными для остальных методов в приложении.

Оригинальный ответ здесь:

Сохраняйте ссылку на виджеты, когда вы их создаете, делая их атрибуты экземпляра (например, self.botInput = QLineEdit (self)). Тогда ты можешь получить к ним доступ таким же образом (self.botInput) из любого метода вашего класс. Я бы посоветовал пройти несколько базовых руководств по объекту ориентированное программирование на Python, чтобы познакомиться с концепциями вам нужно будет успешно писать программы с графическим интерфейсом

2022 WebDevInsider