【问题标题】:Import .CSV data to fill a QTableWidget导入 .CSV 数据以填充 QTableWidget
【发布时间】:2022-06-13 06:22:52
【问题描述】:

我正在构建一个 GUI,我需要在其中将几个 CSV 文件中的数据显示到屏幕上。我已经尝试过,但无法提出解决方案。我对编程和 python 有点陌生。我会接受我能得到的任何建议。

您可以使用 CSV 模块吗?例如:

def loadCsvFile(self, test.csv):
        with open(test.csv, "r") as stream:
            for row in csv.reader(stream):

Bellow 是我的 UI 文件的 sn-p,它很大。但我想用 CSV 内容填充名为 Xerox_work_centre_db 的 QTableWidget。我想知道如何才能做到这一点?

self.verticalLayout_13.addWidget(self.Monitor_header, 0, Qt.AlignTop)

        self.Monitor_main_content = QFrame(self.Monitor)
        self.Monitor_main_content.setObjectName(u"Monitor_main_content")
        sizePolicy.setHeightForWidth(self.Monitor_main_content.sizePolicy().hasHeightForWidth())
        self.Monitor_main_content.setSizePolicy(sizePolicy)
        self.Monitor_main_content.setFrameShape(QFrame.StyledPanel)
        self.Monitor_main_content.setFrameShadow(QFrame.Raised)
        self.Xerox_workcentre_db = QTableWidget(self.Monitor_main_content)
        self.Xerox_workcentre_db.setObjectName(u"Xerox_workcentre_db")
        self.Xerox_workcentre_db.setGeometry(QRect(0, 1, 801, 611))

        self.verticalLayout_13.addWidget(self.Monitor_main_content)

        self.stackedWidget.addWidget(self.Monitor)
        self.Alerts = QWidget()
        self.Alerts.setObjectName(u"Alerts")
        self.stackedWidget.addWidget(self.Alerts)
        self.Order = QWidget()
        self.Order.setObjectName(u"Order")
        self.stackedWidget.addWidget(self.Order)

        self.verticalLayout_12.addWidget(self.stackedWidget)


        self.verticalLayout.addWidget(self.main_body_content)

        self.footer = QFrame(self.main_body)
        self.footer.setObjectName(u"footer")
        self.footer.setStyleSheet(u"QFrame{\n"

更新代码,现在返回如下错误:

文件“C:\Temp\GitHub\CSV_to_UI\main.py”,第 176 行,在 loadCsv self.model.appendRow(项目) AttributeError: 'MainWindow' 对象没有属性 'model'

来自 ui_interface.py

self.verticalLayout_13.addWidget(self.Monitor_header, 0, Qt.AlignTop)

        self.Monitor_main_content = QFrame(self.Monitor)
        self.Monitor_main_content.setObjectName(u"Monitor_main_content")
        sizePolicy.setHeightForWidth(self.Monitor_main_content.sizePolicy().hasHeightForWidth())
        self.Monitor_main_content.setSizePolicy(sizePolicy)
        self.Monitor_main_content.setFrameShape(QFrame.StyledPanel)
        self.Monitor_main_content.setFrameShadow(QFrame.Raised)
        self.verticalLayout_18 = QVBoxLayout(self.Monitor_main_content)
        self.verticalLayout_18.setSpacing(0)
        self.verticalLayout_18.setObjectName(u"verticalLayout_18")
        self.verticalLayout_18.setContentsMargins(0, 0, 0, 0)
        #######################################
        ### CSV CONTENT
        self.model = QStandardItemModel(MainWindow)
        self.Xerox_workcentre_db = QTableView(self.Monitor_main_content)
        self.Xerox_workcentre_db.setObjectName(u"Xerox_workcentre_db")
        self.Xerox_workcentre_db.setModel(self.model)
        self.Xerox_workcentre_db.horizontalHeader().setStretchLastSection(True)

        self.verticalLayout_18.addWidget(self.Xerox_workcentre_db)
        #######################################

来自 main.py

## MAIN WINDOW CLASS
########################################################################
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.shadow = QGraphicsDropShadowEffect(self)
        self.shadow.setBlurRadius(50)
        self.shadow.setXOffset(0)
        self.shadow.setYOffset(0)
        self.shadow.setColor(QColor(0, 92, 157, 550))
        self.ui.centralwidget.setGraphicsEffect(self.shadow)
        self.setWindowIcon(QIcon(""))
        # Set window tittle
        self.setWindowTitle("Printer Monitoring v1.0")
        QSizeGrip(self.ui.size_grip)

        #######################################################################
        ## Button for loadCsv
        self.ui.Xerox_workcentre_button.clicked.connect(self.loadCsv)
        
#######################################################################

        self.ui.minimize_window_button.clicked.connect(lambda: self.showMinimized())
        
        self.ui.close_window_button.clicked.connect(lambda: self.close())
        self.ui.exit_button.clicked.connect(lambda: self.close())

        
        self.ui.restore_window_button.clicked.connect(lambda: self.restore_or_maximize_window())
        

        def moveWindow(e):
            if self.isMaximized() == False:  # Not maximized
                if e.buttons() == Qt.LeftButton:             
                    self.move(self.pos() + e.globalPos() - self.clickPosition)
                    self.clickPosition = e.globalPos()
                    e.accept()

        
        self.ui.header_frame.mouseMoveEvent = moveWindow     
        self.ui.open_close_side_bar_btn.clicked.connect(lambda: self.slideLeftMenu())

        self.show()

    
    def slideLeftMenu(self):
        # Get current left menu width
        width = self.ui.slide_menu_container.width()

        # If minimized
        if width == 0:
            # Expand menu
            newWidth = 200
            self.ui.open_close_side_bar_btn.setIcon(QIcon(u":/icons/icons/chevron-left-solid-white.svg"))
        # If maximized
        else:
            # Restore menu
            newWidth = 0
            self.ui.open_close_side_bar_btn.setIcon(QIcon(u":/icons/icons/bars-solid-white.svg"))

        # Animate the transition
        self.animation = QPropertyAnimation(self.ui.slide_menu_container, b"minimumWidth")  # Animate minimumWidth
        self.animation.setDuration(350)
        self.animation.setStartValue(width)  # Start value is the current menu width
        self.animation.setEndValue(newWidth)  # end value is the new menu width
        self.animation.setEasingCurve(QEasingCurve.InOutQuart)
        self.animation.start()

    def mousePressEvent(self, event):
        self.clickPosition = event.globalPos()

    def restore_or_maximize_window(self):
        # If window is maximized
        if self.isMaximized():
            self.showNormal()
            # Change Icon
            self.ui.restore_window_button.setIcon(QIcon(u":/icons/icons/window-maximize-regular-white.svg"))
        else:
            self.showMaximized()
            self.ui.restore_window_button.setIcon(QIcon(u":/icons/icons/window-restore-solid-white.svg"))
    #######################################################################
    # CALL XEROX CSV FUNCTION

    def loadCsv(self):
        fileName= 'Xerox_workcentre_test.csv'
        with open(fileName, "r") as fileInput:
            for row in csv.reader(fileInput):
                items = [
                    QtGui.QStandardItem(field)
                    for field in row
                ]
                self.model.appendRow(items)

【问题讨论】:

  • 遵循documentation 中的说明(虽然它是为 C++ 编写的,但函数调用与 Python 相同)。请注意,您应该尝试编辑 pyuic 的输出,而应遵循有关 using Designer 的官方指南。然后,确保 所有 小部件都包含在 layout managers 中(似乎该表只是“浮动”在 Monitor_main_content 中)。最后,只有类和常量应该有大写的名称。
  • 感谢您的回答。正如我所说,我正在接受我能得到的每一个指针。我很感激我能得到的每一个答案。
  • 我现在已经更新了我的代码,但是它返回了一个我无法完全理解的错误。
  • 那是因为self.model 是在Ui_MainWindow 中创建的,而不是在MainWindow 中创建的。这是您应该修改 pyuic 文件的另一个原因,因为它会造成对象结构的不一致和混乱。重建 ui 文件,并在 MainWindow 类中创建 self.model
  • 是的,我注意到那天之后我太累了。我改变了我的方法,没有触摸 UI 文件而是从 main.py 初始化所有内容!

标签: python arrays database csv pyqt5


【解决方案1】:

因为我在 main.py 中有函数 loadCsv,而在 ui_interface.py 中有其余的函数。我称 self.model 错误。 我只是简单地从 main.py 初始化了所有内容。

def loadCsv(self):
        fileName= 'Xerox_workcentre_test.csv'
        with open(fileName, "r") as fileInput:
            for row in csv.reader(fileInput):
                items = [
                    QtGui.QStandardItem(field)
                    for field in row
                ]
                self.ui.model.appendRow(items)

【讨论】:

    猜你喜欢
    • 2013-03-03
    • 2012-08-02
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多