Найти - Пользователи
Полная версия: Перерисовка таблицы в PyQt
Начало » Python для новичков » Перерисовка таблицы в PyQt
1
Novucu1
Тема, скорее всего, избитая, но всё же:
Есть глубоко вложенная таблица. Вызывается метод, который через threading.Timer запускает два других метода, каждый из которых меняет фоновый цвет ячейки таблицы. Сначала срабатывает один метод, затем - второй. Однако после срабатывания второго метода перерисовка таблицы не происходит. update(), repaint() - не срабатывают, окно обновляется только тогда, когда само пожелает. Код:
def Select_Body(self, x, y):
        t = threading.Timer(1, self.Select_b, (x, y))
        t.start()
        t2 = threading.Timer(2, self.Unselect_b, (x, y))
        t2.start()
    def Select_b(self, x, y):
        self.body.item(x, y).setBackground(self.check_color)
        self.window.repaint()
    def Unselect_b(self, x, y):
        self.body.item(x, y).setBackground(self.standart_color)
        self.window.repaint()

Примечательно, что по отношению к другой таблице в том же окне аналогичный код срабатывает:
def Select_Gene(self, creature_id, numgen):
        self.ch_column=numgen
        self.ch_creature_id=creature_id
        
        t = threading.Timer(1, self.Select_g)
        t.start()
        t2 = threading.Timer(2, self.Unselect_g)
        t2.start()
    def Select_g(self):
        el=self.result[self.ch_creature_id].item(2, self.ch_column)
        el.setBackground(self.check_color)
        self.window.repaint()
    def Unselect_g(self):
        el=self.result[self.ch_creature_id].item(2, self.ch_column)
        el.setBackground(self.standart_color)
        self.window.repaint()
В последнем случае ячейка таблицы, как и ожидалось, меняет цвет 2 раза, с промежутком в секунду.
Как же перерисовать таблицу?
Novucu1
Вот так работает:
        self.setUpdatesEnabled(False)
        #тут какие-то действия с перерисовкой
        self.setUpdatesEnabled(True)
        self.update()
Видно, PyQt считает количество изменений в элементах и намертво бокирует перерисовки, если они запрашиваются слишком часто. Поэтому запретили перерисовку, сделали N изменений в элементах, разрешили перерисовку, послали на неё запрос - 1 на все N операций.

Спасибо всем за оперативную помощь.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB