我被要求(对于一个非商业组织)编写一个将在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并构建了自己(也就是一起加入的例子)一些让我入门的初始代码,但是我遇到了一些我根本不知道的基本问题。现在就做出正确的决定,这样他们以后就不会给我带来重大问题。
关于下一步我可以去哪里,我有一些指示:
设置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
希望将来有助于其他人。
干杯基夫