06
Сен
2018

Асинхронная работа в PyQt5

Пишу на Python 3.7.0 + PyQt5

Есть окно, в котором будет перемещаться объект по координатам. Следовательно, вот такой код в paintEvent(self,e):

def paintEvent(self, e):
    print(self.data)
    qp = QPainter(self)
    qp.begin(self)
    
    x0 = self.crab['point0'][0]
    y0 = self.crab['point0'][1]
    
    x1 = self.crab['point1'][0]
    y1 = self.crab['point1'][1]
    
    x2 = self.crab['point2'][0]
    y2 = self.crab['point2'][1]
    
    self.draw_point(e,qp,x0,y0)     # отрисовка центральной точки
    pen = QPen(QColor(0,80,0), 1)
    pen.setStyle(Qt.DotLine)
    qp.setPen(pen)
    
    r1 = math.sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0))
    r2 = math.sqrt((x2-x0)*(x2-x0) + (y2-y0)*(y2-y0))
    qp.drawEllipse(QPoint(x0,y0),r1,r1)   # отрисовка внутренней траектории
    qp.drawEllipse(QPoint(x0,y0), r2, r2) # отрисовка внешней траектории
    pen = QPen(self.settings['color_line'], self.settings['line_width'])
    qp.setPen(pen)
    self.draw_line(e,qp,x1,y1,x2,y2)
    qp.end()

Видно, что координаты берутся из словаря crab{...} Я хочу, чтобы

по нажатию на кнопку 0
, объект сдвигался, делаю так:

# отслеживание нажатия кнопки
def keyPressEvent(self, e):
    if e.key() == QtCore.Qt.Key_Escape:
        self.close()
    if e.key() == QtCore.Qt.Key_0:
        for alpha in range(0,359):
            time.sleep(1)
            self.crab['point1'][0] += 1
            self.crab['point1'][1] += 1
            self.crab['point2'][0] += 1
            self.crab['point2'][1] += 1
            self.update()

Самое главное: При нажатии на 0, начинает отрабатывать сам цикл с задержкой в 1 секунду, но мне также нужно обрабатывать нажатие кнопок(например, ESC). На данный момент при включении цикла программа зависает - это логично.

Как лучше организовать эту функцию? Может быть использовать async/threading?

Источник: https://ru.stackoverflow.com/questions/878174/%D0%90%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D0%B2-pyqt5

Тебе может это понравится...

Добавить комментарий