Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 1, 2015 20:26:22

Novucu1
Зарегистрирован: 2015-10-01
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Перерисовка таблицы в PyQt

Тема, скорее всего, избитая, но всё же:
Есть глубоко вложенная таблица. Вызывается метод, который через 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 раза, с промежутком в секунду.
Как же перерисовать таблицу?

Офлайн

#2 Ноя. 8, 2015 16:03:29

Novucu1
Зарегистрирован: 2015-10-01
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Перерисовка таблицы в PyQt

Вот так работает:

        self.setUpdatesEnabled(False)
        #тут какие-то действия с перерисовкой
        self.setUpdatesEnabled(True)
        self.update()
Видно, PyQt считает количество изменений в элементах и намертво бокирует перерисовки, если они запрашиваются слишком часто. Поэтому запретили перерисовку, сделали N изменений в элементах, разрешили перерисовку, послали на неё запрос - 1 на все N операций.

Спасибо всем за оперативную помощь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version