Nano Hash - криптовалюты, майнинг, программирование

Установить значения таблицы на pyqt5 при загрузке страницы выдает AttributeError

Я пытаюсь установить элементы pyqt5 Qtablewidget при загрузке страницы, используя вспомогательный класс и метод. Это мой код.

#ui - > UI mainwindow class
#examdetails -> a list of dictionaries (table from database)  
def setExamRecords(self,ui,examDetails):
    for rowIndex,exam in enumerate(examDetails):
        for colIndex,key in enumerate(exam):
            print(exam[key])
            item = ui.tableWidget.item(rowIndex, colIndex)
            item.setText(str(exam[key]))
    return True

Однако это возвращает ошибку AttributeError: 'NoneType' object has no attribute 'setText'

нельзя ли установить элементы пользовательского интерфейса в отдельный класс, как это? Причина перехода к отдельному вспомогательному классу в основном состоит в том, чтобы уменьшить засорение кода в основном классе пользовательского интерфейса.


Ответы:


1

Наличие пустой ячейки не означает, что она связана с QTableWidgetItem, поэтому метод item() возвращает None. Возможное решение состоит в том, чтобы проверить, является ли это None или нет, если это так, создайте QTableWidgetItem и установите его с помощью setItem():

def setExamRecords(self, ui, examDetails):
    for rowIndex, exam in enumerate(examDetails):
        for colIndex, key in enumerate(exam):
            print(exam[key])
            item = ui.tableWidget.item(rowIndex, colIndex)
            if item is None:
                item = QTableWidgetItem()
                ui.tableWidget.setItem(rowIndex, colIndex, item)
            item.setText(str(exam[key]))
    return True

Другим возможным решением является использование модели, в которой, если каждая ячейка связана с QModelIndex:

def setExamRecords(self, ui, examDetails):
    for rowIndex, exam in enumerate(examDetails):
        for colIndex, key in enumerate(exam):
            index = ui.tableWidget.model().index(rowIndex, colIndex)
            ui.tableWidget.model().setData(index, str(exam[key]))
    return True
26.02.2021
  • Большое спасибо @eyllanesc. Это на самом деле решает проблему для меня, и второе решение отлично, потому что мне не нужно импортировать сюда внешнюю библиотеку. Но маленький вопрос. Это генерирует только первую строку, хотя в списке 3 словаря. Любая идея, почему это происходит именно так? 26.02.2021
  • @NipunAlahakoon, если вам нужно больше строк, вы должны установить его перед циклом for: ui.tableWidget.setRowCount(50) или вставить его при необходимости с помощью ui.tableWidget.insertRow(ui.tableWidget.rowCount()). Я больше не могу помочь, потому что вы не предоставляете минимально воспроизводимый пример, я ограничиваюсь только тем, что вы показывать 26.02.2021
  • Без проблем. это решило проблему для меня. большое тебе спасибо. 26.02.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..