crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

6 страниц V  « < 2 3 4 5 6 >  
Ответить в данную темуНачать новую тему
> Торможения таймера при рисовании, Python
lanz
  опции профиля:
сообщение 9.4.2013, 8:25
Сообщение #31


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


И в том треде я писал, что надо вынести этот код из таймера.

И вообще, насколько я помню файлы запрещено использовать, значит данные будут приходить не из файлов, а каким то другим путем. Из сокетов или из порта/карты захвата. Значит надо формировать картинки по событию поступления их в программу. И добавлять в очередь например, но каждый кадр перерисовывать их нельзя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 9.4.2013, 9:40
Сообщение #32


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 9.4.2013, 8:25) *
И вообще, насколько я помню файлы запрещено использовать, значит данные будут приходить не из файлов


Так как это эмуляция, то в настоящий момент использую файлы.

Как я понял всё работает прекрасно, если избавится от циклов.

Вот код:

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui, uic
import math
phi = 0.0
class ld(QtGui.QDialog):
    def __init__(self, parent=None):
        super(ld, self).__init__(parent)
        self.ui = uic.loadUi("ld.ui", self)
        self.timer = QtCore.QTimer()
        self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.MyTimer)
        self.timer.setInterval(3)
        self.timer.start()
    def paintEvent(self, QPaintEvent):
        if self.ui.radioButton.isChecked():
            painterRect = QtGui.QPainter(self)
            painterRect.setBrush(QtGui.QColor('black'))
            painterRect.drawRect(50, 50, 720, 492)
            self.MyDraw()
        self.update()
    def MyRadianToGradus(self, phiedit):
        gradus = phiedit * 360 / (2 * math.pi)
        return gradus
    def MyGradusToRadian(self, phiedit):
        radian = phiedit * 2 * math.pi / (360)
        return radian
    def MyTimer(self):
        global phi
        self.update()
        if int(self.MyRadianToGradus(phi) + 0.5) * 720 / 360 < 720:
            phi += self.MyGradusToRadian(6.0)
        else:
            phi = self.MyGradusToRadian(6.0)
    def MyDraw(self):
        global phi
        p = QtGui.QPainter(self)
        p.translate(50, 50)
        p.fillRect(0, 0, int(self.MyRadianToGradus(phi)+0.5)*720/360, 492, QtGui.QColor('red'))
if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = ld()
    window.show()
    sys.exit(app.exec_())


То есть мне надо избавится от циклов в двух моментах:
1. Вывод изображений на экран.
2. Заполнения объекта QImage значениями из файла.

Если я в пункте номер 1 избавляюсь от циклов с помощью drawImage, то от циклов во втором пункте я не смог изавится.

Может кто знает, как избавится от циклов в обоих пунктах?

Сообщение отредактировал zuze - 9.4.2013, 9:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 9.4.2013, 13:35
Сообщение #33


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Во втором пункте никак не избавиться.

С какой скоростью появляются новые картинки?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 9.4.2013, 13:38
Сообщение #34


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 9.4.2013, 13:35) *
С какой скоростью появляются новые картинки?


Самая маленькая скорость появление следующей картинки будет, через 10 секунд, а самая большая скорось появление следующей картинки будет, через 0,05 секунды.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 10.4.2013, 14:20
Сообщение #35


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


А сколько времени должна рисоваться одна картинка?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 10.4.2013, 15:55
Сообщение #36


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 10.4.2013, 14:20) *
А сколько времени должна рисоваться одна картинка?


Самая маленькая скорость появление следующей картинки будет, через 10 секунд, а самая большая скорось появление следующей картинки будет, через 0,05 секунды.
При скорости рисовании картинки 0,05 * 1000 мс, рисования одного кусочка картинки (0,05 * 1000) / 60 мс
При скорости рисовании картинки 10 * 1000 мс, рисования одного кусочка картинки (10 * 1000) / 60 мс

То есть за время "0,05 * 1000 мс" или "10 * 1000 мс" рисунок нарисуется полностью за 60 раз срабатывания таймера.

Сообщение отредактировал zuze - 10.4.2013, 15:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 10.4.2013, 16:21
Сообщение #37


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Очень странные цифры, за 50 мс - это два - три кадра, зачем перерисовывать картинку 60 раз?

И если надо так быстро получать картинки, используйте numpy например, а потом загружайте картинку напрямую через QImage::scanline ()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 11.4.2013, 15:16
Сообщение #38


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 10.4.2013, 16:21) *
зачем перерисовывать картинку 60 раз?


Я не всю картинку перерисовываю 60 раз, а я дорисовываю, кусочек картинки каждый раз и полностью картинка появляется когда пройдёт таймер 60 раз.

Цитата(lanz @ 10.4.2013, 16:21) *
И если надо так быстро получать картинки, используйте numpy например, а потом загружайте картинку напрямую через QImage::scanline()


a = numpy.fromfile(fp, dtype=numpy.uint8)
a = numpy.flipud(a.reshape((height, width), order='F'))


Но вот как правильно загрузить я не понял. Помогите пожалуйста это понять.

Я пробовал так сделать:

a = numpy.fromfile(fp, dtype=numpy.uint8)
a = numpy.flipud(a.reshape((492, 720), order='F'))
a.tostring()
im = QtGui.QImage.__init__(self, self, 492, 720, self.Format_Indexed8)


Для вывода так делаю:

def MyDraw(self):
        global im

        Tochka = QtGui.QPainter()
        Tochka.begin(self)

        Tochka.translate(50, 50)
        Tochka.drawImage(0, 0, im, 0, 0, int((2*self.MyRadianToGradus(phi))+0.5), 492)

        Tochka.end()

        self.update()


Выдаётся вот такая ошибка:

im = QtGui.QImage.__init__(self, self, 492, 720, self.Format_Indexed8)
TypeError: 'sip.methoddescriptor' object is not callable

Я пробовал в место

a.tostring()
im = QtGui.QImage.__init__(self, self, 492, 720, self.Format_Indexed8)


Написать

self.__data = a.tostring()
im = QtGui.QImage.__init__(self, self.__data, 492, 720, self.Format_Indexed8)


Пробоывал ещё так:

self.__data = a.tostring()
im = QtGui.QImage.__init__(self.__data, 492, 720, self.Format_Indexed8)


Таже самая ошибка. Не знаю важно или нет, но у меня Python 2.6

Как я понял я не правильно конструктор определил, а вот как правильно не понимаю. Помогите пожалуйста понять.

Сообщение отредактировал zuze - 15.4.2013, 9:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 15.4.2013, 13:06
Сообщение #39


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Сделал так:

data = a.tostring()
im = QtGui.QImage(data, 492, 720, QtGui.QImage.Format_ARGB32)


Это ошибка пропадает.
Но в момент первого срабатывания таймера возникает ошибка:
Появляется окно с выбором из трёх кнопок:
1 кнопка (Искать решение проблемы в Интернете и закрыть программу)
2 кнопка (Закрыть программу)
3 кнопка (отладить программу)

А текстом пишется:
Process finished with exit code -1073741819

В чём может быть дело?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 15.4.2013, 13:55
Сообщение #40


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Ошибка при работе с памятью скорее всего, видимо с размером что то напутано.

Выложите проект, попробую потыркать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

6 страниц V  « < 2 3 4 5 6 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 4:04