由于更新缓慢,PyQt动态秒表计时器很慢

时间:2016-04-20 12:23:54

标签: python-3.x timer pyqt

我正在制作一个"秒表"参加比赛。参与者开始做某事,我为节目加注,参与者可以看到他自己的位置,该位置随手表动态更新。我在下面有一个功能齐全的代码:

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功能,并且每个小时都会触发它。在计时器内部我更新列表,因此参与者和观众可以一直看到他的位置。问题是每个参与者的计时器都比较慢。

我认为它是因为计算机很慢,并且无法快速更新图形表,但是我很难想出一个更好的想法让时钟作为一个真正的时钟工作,并保持列表的动态更新同样。

任何帮助将不胜感激!

0 个答案:

没有答案