我正在制作一个"秒表"参加比赛。参与者开始做某事,我为节目加注,参与者可以看到他自己的位置,该位置随手表动态更新。我在下面有一个功能齐全的代码:
import sys
from PyQt4 import QtGui, QtCore
class Main(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.ms = 0
self.s = 0
self.m = 0
self.data_list = {
"asd": "00:02:01",
"bsd": "00:07:01",
"csd": "00:01:01",
"rrsd": "00:04:01",
"fghsd": "00:01:41",
"tzu": "00:09:01",
"azud": "00:02:01",
"cvb": "00:01:41",
"jkl": "00:01:06",
"aertt": "00:11:01"
}
self.next_comp = ""
self.timer_state = False
self.table_rows = 9
self.table_cols = 3
self.participants_above = 6
self.initUI()
def initUI(self):
centralwidget = QtGui.QWidget(self)
self.lcd = QtGui.QLCDNumber(self)
time = "{0:02d}:{1:02d}:{2:02d}".format(self.m, self.s, self.ms)
self.lcd.setDigitCount(len(time))
self.lcd.display(time)
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.Time)
self.start = QtGui.QPushButton("Start/Stop", self)
self.start.clicked.connect(self.Start)
self.reset = QtGui.QPushButton("Reset", self)
self.reset.clicked.connect(self.Reset)
self.le_name = QtGui.QLineEdit()
self.table = QtGui.QTableWidget()
self.table.setStyleSheet('QTableWidget { font-size: 24pt; padding: 10px; }')
self.table.setRowCount(self.table_rows)
self.table.setColumnCount(self.table_cols)
self.table.setShowGrid(False)
self.table.verticalHeader().setDefaultSectionSize(60)
self.table.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
self.table.verticalHeader().setVisible(False)
self.table.horizontalHeader().setVisible(False)
self.update_table()
grid = QtGui.QGridLayout()
grid.addWidget(self.start, 1, 0)
grid.addWidget(self.reset, 1, 2)
grid.addWidget(self.lcd, 2, 0, 1, 3)
grid.addWidget(self.le_name, 3, 0, 1, 3)
grid.addWidget(self.table, 4, 0, 1, 3)
grid.setRowMinimumHeight(2, 100)
centralwidget.setLayout(grid)
self.setCentralWidget(centralwidget)
# ---------Window settings --------------------------------
self.setGeometry(300, 300, 380, 370)
# self.showFullScreen()
def update_table(self, new_entry=""):
local_data = self.data_list
local_data.update(new_entry)
local_data = [(v, k) for k, v in local_data.items()]
local_data.sort(reverse=True)
if new_entry:
pos = local_data.index(tuple([(v, k) for k, v in new_entry.items()])[0])
else:
pos = len(local_data) - 1
local_data = [(i, k) for i, k in enumerate(local_data)]
if pos > self.participants_above:
local_data = local_data[pos - self.participants_above:]
for i, j in enumerate(local_data):
self.a = QtGui.QTableWidgetItem(str(j[0] + 1))
self.a.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
self.table.setItem(i, 0, self.a)
if new_entry and j[1] == tuple([(v, k) for k, v in new_entry.items()])[0]:
self.table.item(i, 0).setBackground(QtGui.QColor("red"))
self.a = QtGui.QTableWidgetItem(j[1][0])
self.a.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignCenter)
self.table.setItem(i, 1, self.a)
if new_entry and j[1] == tuple([(v, k) for k, v in new_entry.items()])[0]:
self.table.item(i, 1).setBackground(QtGui.QColor("red"))
self.a = QtGui.QTableWidgetItem(j[1][1])
self.a.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft)
self.table.setItem(i, 2, self.a)
if new_entry and j[1] == tuple([(v, k) for k, v in new_entry.items()])[0]:
self.table.item(i, 2).setBackground(QtGui.QColor("red"))
def clear_table(self):
for i in range(self.table_rows):
for j in range(self.table_cols):
self.table.setItem(i, j, QtGui.QTableWidgetItem(""))
def Reset(self):
self.timer.stop()
self.clear_table()
self.update_table()
self.timer_state = False
self.s = 0
self.m = 0
self.ms = 0
time = "{0:02d}:{1:02d}:{2:02d}".format(self.m, self.s, self.ms)
self.lcd.setDigitCount(len(time))
self.lcd.display(time)
def Start(self):
if not self.timer_state:
self.timer_state = True
self.timer.start(10)
else:
self.timer_state = False
self.timer.stop()
def Time(self):
if self.ms < 99:
self.ms += 1
else:
if self.s < 59:
self.ms = 0
self.s += 1
elif self.s == 59 and self.m < 99:
self.m += 1
self.ms = 0
self.s = 0
else:
self.timer.stop()
time = "{0:02d}:{1:02d}:{2:02d}".format(self.m, self.s, self.ms)
self.update_table({self.le_name.text(): time})
self.lcd.setDigitCount(len(time))
self.lcd.display(time)
app = QtGui.QApplication(sys.argv)
main = Main()
main.show()
sys.exit(app.exec_())
正如您所看到的那样,计时器指向Time
功能,并且每个小时都会触发它。在计时器内部我更新列表,因此参与者和观众可以一直看到他的位置。问题是每个参与者的计时器都比较慢。
我认为它是因为计算机很慢,并且无法快速更新图形表,但是我很难想出一个更好的想法让时钟作为一个真正的时钟工作,并保持列表的动态更新同样。
任何帮助将不胜感激!