PyQt5 - CSV导入,显示和滚动建议 - 视图与小部件,QTreeView与其他

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQt5 - CSV导入,显示和滚动建议 - 视图与小部件,QTreeView与其他相关的知识,希望对你有一定的参考价值。

我被要求(对于一个非商业组织)编写一个将在Pi上运行的应用程序,并在屏幕上显示一个Racers列表,分为3个垂直部分(On Course(1),In Gate(1)和在队列中(最多50个))。 “In Queue”部分预计不会显示所有条目 - 只有接下来的10条说明。

该列表最初来自USB记忆棒上的CSV文件。当赛车进入起跑门时,屏幕上的列表应根据外部输入进行滚动,如果出现问题,可以使用覆盖机制(屏幕上的按钮,硬件按钮等)向上或向下。列表的每一行将包含3个左右的条目 - 例如,号码,姓名和以前的运行时间。

滚动应该好像列表的三个部分是一个部分。即单个滚动动作应该改变:On Course racer滚动屏幕顶部,In Gate赛车成为On Course赛车,顶部In Queue赛车成为下一个In Gate赛车。

我被要求更多解释滚动如何工作,试图在这里模拟一些东西很难,但这有助于:

开始画面:

Racer on Course:
  [blank]
Racer in Gate:
  10, Jo Blogs, 13.3
Racers in Queue:
  11, John Harrow, 13.4
  12, Lynne Graham, 13.5
  13, Lindsey Vonn, 14.5

首次'滚动'动作后的屏幕:

Racer on Course:
  10  Jo Blogs  13.3
Racer in Gate:
  11, John Harrow, 13.4
Racers in Queue:
  12, Lynne Graham, 13.5
  13, Lindsey Vonn, 14.5

第二次“滚动”动作后的屏幕:

Racer on Course:
  11,John Harrow,13.4
Racer in Gate:
  12,Lynne Graham,13.5
Racers in Queue:
  13,Lindsey Vonn,14.5

无需编辑或保存任何数据 - 只需按CSV显示即可。

我决定使用Python 3和PyQt5,因为它们是跨平台的,广泛使用,大量示例,教程等。

在过去的15年里,我已经多次使用过Python,但是我的面向对象技能很弱,我以前没有使用过Qt。

CSV示例可能如下所示:

10,Jo Blogs,13.3
11,John Harrow,13.4
12,Lynne Graham,13.5
13,Lindsey Vonn,14.5

应用程序(没有加载任何数据)可能如下所示:

到目前为止,我已经完成了几个教程,包括Zetcode one:http://zetcode.com/gui/pyqt5并构建了自己(也就是一起加入的例子)一些让我入门的初始代码,但是我遇到了一些我根本不知道的基本问题。现在就做出正确的决定,这样他们以后就不会给我带来重大问题。

  1. QTreeWidget / QTreeView是否适合用于显示的Qt Widget?
  2. QTreeWidget与QtreeView - 我理解不同之处在于存储在小部件中的数据与数据模型中的数据以及仅显示该数据的小部件 - 但我不知道正确的方式为我和这个应用程序。
  3. 滚动行通过3个小部件作为单个实体 - 设置它的最简单/最佳/正确方法是什么?

关于下一步我可以去哪里,我有一些指示:

设置TreeViews - https://pythonspot.com/pyqt5-treeview/

将CSV数据加载到窗口小部件 - pyqt - populating QTableWidget with csv data

任何积极的帮助,指针,建筑方向赞赏。

非常感谢

我的代码到目前为止参考......

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import (QMainWindow, QTextEdit, QWidget, QLabel, QGridLayout, QLineEdit, QPlainTextEdit,
                             QTreeView, QAction, QFileDialog, QApplication, qApp)

from PyQt5.QtGui import QIcon
import sys


class Start(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        # Build Status Bar
        self.statusBar()

        # File Menu File > Open Action
        openFile = QAction(QIcon('open.png'), 'Open', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip('Open new File')
        openFile.triggered.connect(self.showOpenDialog)

        # File Menu File > Exit Action
        exitAct = QAction(QIcon('exit.png'), '&Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(qApp.quit)

        # Build Menu Bar
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(openFile)
        fileMenu.addAction(exitAct)

        self.widget = QWidget()
        self.setCentralWidget(self.widget)

        # Build Central Widget
        lblOnCourse = QLabel('Racer On Course:', self)
        lblInGate = QLabel('Racer In gate:', self)
        lblInQueue = QLabel('Racers In Queue:', self)

        grid = QGridLayout()
        grid.setSpacing(10)

        OnCourse = QTreeView()
        InGate = QTreeView()
        InQueue = QTreeView()

        InQueue.setRootIsDecorated(False)
        #InQueue.dataView.setAlternatingRowColors(True)

        grid.addWidget(lblOnCourse, 1, 0)
        grid.addWidget(OnCourse, 1, 1)

        grid.addWidget(lblInGate, 2, 0)
        grid.addWidget(InGate, 2, 1)

        grid.addWidget(lblInQueue, 3, 0)
        grid.addWidget(InQueue, 3, 1, 5, 1)

        self.widget.setLayout(grid)

        # Show QMainWindow
        self.showMaximized()
        #self.showFullScreen()
        #self.show()


    def showOpenDialog(self):
        fname = QFileDialog.getOpenFileName(self, 'Open file', '/')

        if fname[0]:
            f = open(fname[0], 'r')

            with f:
                data = f.readlines()
                #self.textEdit.setText(data)

            self.statusBar().showMessage('Loaded: ' + str(len(data)) + '. ')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Start()
    sys.exit(app.exec_())

答案

所以在fiverr的帮助下,我现在有了一些工作代码。填充到QTree的数据如下解决:

# Create some data:
data = ['XXX' for _ in range(8)]

# Create instance of QTreeView
IG = QTreeView()

# Create a View Model
IGM = self.prepModel(IG)

# Populate View Model
fillModel(IGM, data[1:2])


def prepModel(self, widget):
    # initialize a model
    model = QStandardItemModel()

    # remove indentation and headers
    widget.setIndentation(0)
    widget.setHeaderHidden(1)

    # add (data) model to widget
    widget.setModel(model)
    return model


def fillModel(self, model, data):
    for i, d in enumerate(data):
        model.setItem(i, QStandardItem(d))
    return

不同QTreeViews中的不同(行数)行是通过使用不同(数量)数据填充QTreeViewModel来完成的:

    def display(self):
        # show the first
        self.fillModel(self.OCM, self.data[0:1])

        # show the second
        self.fillModel(self.IGM, self.data[1:2])

        # show the first (n) of the rest
        #self.fillModel(self.IQM, self.data[2:self.displayMaxIQRows + 2])
        # show the full queue (-1 doesn't show last?)
        self.fillModel(self.IQM, self.data[2:len(self.data)])

滚动是通过在两个数组之间移动数据来完成的,然后重新运行'display'以重新填充QTreeViewModel。

    def scroll(self):
        # add first element to past data
        self.pastData = self.pastData + self.data[0:1]

        # remove the first element from data
        self.data.pop(0)

        # refresh the racers list
        self.displayRacers()
        return

希望将来有助于其他人。

干杯基夫

以上是关于PyQt5 - CSV导入,显示和滚动建议 - 视图与小部件,QTreeView与其他的主要内容,如果未能解决你的问题,请参考以下文章

使用pyqt5显示选定行中的一个单元格

MySQL Workbench 数据导入向导未显示 CSV 中的所有列

csv文件用EXCEL打开是乱码,怎么办

在 PyQt5 中使用 Matplotlib 绘制 CSV 文件

无法在 Pyqt5 的 Qtext 编辑中使用 jinja2 设置表格的 CSS(文本换行和水平滚动条)

使用PyQt5 for Python gui的可滚动标签