crossplatform.ru

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

> Торможения таймера при рисовании, Python
zuze
  опции профиля:
сообщение 29.3.2013, 10:34
Сообщение #1


Участник
**

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

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




Репутация:   0  


Я пытаюсь закрасить область красным цветом за определённое время. Область будет закрашиватся каждый раз пока я не остановлю таймер.
Код:
# Глобальные
phi = 0.0
FlagStopRunPhi = 0
RunStopTimer = 1
timer = QtCore.QTimer()
im1 = QtGui.QImage(720, 492, QtGui.QImage.Format_ARGB32)

# В конструкторе

# Запустить таймер
self.connect(self.ui.pushButton_3, QtCore.SIGNAL("clicked()"), self.BlockTimer)

# Что происходит по таймеру
self.connect(timer, QtCore.SIGNAL("timeout()"), self.MyTimer)

def paintEvent(self, QPaintEvent):
      self.MyDraw()

# Запустить таймер
def BlockTimer(self):
            timer.start(0.05*1000)/60)

# Что происходит по таймеру
def MyTimer(self):
        global phi
        global im1

        if self.ui.checkBox_4.isChecked():
            for j in range(0, 720, 1):
                for i in range(491, -1, -1):
                    im1.setPixel(j, i, QtGui.QColor(255, 0, 0, 255).rgba())

        self.update()

        if self.ui.radioButton_2.isChecked():
            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 im1
        global phi

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

        Tochka.translate(50, 50)

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

        Tochka.end()


Должно быстро закрашиватся цветом, а закрашивается, только через каждые 0.5 секунды. Почему так происходит? В Qt всё быстро закрашивается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
zuze
  опции профиля:
сообщение 7.5.2013, 10:53
Сообщение #2


Участник
**

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

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




Репутация:   0  


lanz, прошу прощения, что не отвечал, был в отпуске.

Всё равно тут цикл хоть и один.

Пешил воспользоваться библиотекой matplotlib, так как вроде она сразу выводить массив на экран. Пока хочу целиком картинку вывести.

Вот код:

# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui, uic
import numpy
import math
import os
import struct
import matplotlib.pyplot as plt

dir = os.path.join(os.getcwd(), "file")
phi = 0.0

a = []

class ld(QtGui.QDialog):
    def __init__(self, parent=None):
        super(ld, self).__init__(parent)
        self.ui = uic.loadUi("ld.ui", self)

        self.connect(self.ui.radioButton_2, QtCore.SIGNAL("clicked()"), self.MyClickRect)

        self.timer = QtCore.QTimer()
        self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.MyTimer)
        self.timer.setInterval(5000)
        self.timer.start()

    def paintEvent(self, QPaintEvent):
        if self.ui.radioButton_2.isChecked():
            painterRect = QtGui.QPainter(self)
            painterRect.setBrush(QtGui.QColor('black'))
            painterRect.drawRect(50, 50, 720, 492)
            self.MyDraw()

    def MyClickRect(self):
        self.update()

    def MyTimer(self):
        global dir
        global phi
        global fp
        global a

        if self.ui.checkBox_4.isChecked():
            os.chdir(dir)
            try:
                fp = open("1.dat", "rb")

            except IOError:
                print "Cannot open file read!"

            fp.seek(0, 2)
            size = fp.tell()
            fp.seek(size - (492*720), 0)

            a = numpy.fromfile(fp, dtype=numpy.uint8)
            a = numpy.flipud(a.reshape((492, 720), order='F'))
            a.tostring()

        self.update()

        if self.ui.radioButton_2.isChecked():
            if int((math.degrees(phi)+0.5)*720)/360 < 720:
                phi += math.radians(6.0)
            else:
                phi = math.radians(6.0)

    def MyDraw(self):
        plt.imshow(a, interpolation="none")
                plt.show()

if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)

    window = ld()
    window.show()

    sys.exit(app.exec_())


Картинка выводится в отельном окне, но к сожалению ошибки:

plt.imshow(a, interpolation="none")


Ошибка такая:

File "D:/PythonProject/l/ld.py", line 44, in paintEvent
self.MyDraw()
File "D:/PythonProject/l/ld.py", line 100, in MyDraw
plt.imshow(a, interpolation="none")
File "D:\Python26\Lib\site-packages\matplotlib\pyplot.py", line 2737, in imshow
imlim=imlim, resample=resample, url=url, **kwargs)
File "D:\Python26\Lib\site-packages\matplotlib\axes.py", line 7105, in imshow
im.set_data(X)
File "D:\Python26\Lib\site-packages\matplotlib\image.py", line 422, in set_data
raise TypeError("Invalid dimensions for image data")
TypeError: Invalid dimensions for image data

Может это из-за того, что в отельном окне всё рисуется?

И ещё вопросик: как переделать

plt.imshow(a, interpolation="none")


Чтобы получилось аналог этого:

Tochka.drawImage(0, 0, im, 0, 0, int((2*math.degrees(phi))+0.5), 492)


Может я зря воспользоваться библиотекой matplotlib, а можно было воспользоватся библиотекой PIL (Python Imaging Library)?
Но я, что-то не нашёл функции для рисования картинки по данным из двухмерного массива.

Сообщение отредактировал zuze - 8.5.2013, 13:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- zuze   Торможения таймера при рисовании   29.3.2013, 10:34
- - Iron Bug   питон - интерпретатор. его скорость от 10 до 500 р...   29.3.2013, 11:02
- - zuze   Цитата(Iron Bug @ 29.3.2013, 11:02) питон...   29.3.2013, 11:17
- - Iron Bug   если ты утверждаешь, что Qt не тормозит, то больше...   29.3.2013, 16:57
- - zuze   Прямоугольная область с торможениями закрашивается...   3.4.2013, 15:28
- - lanz   timer.start((0.005 * 1000) / 60) (...   4.4.2013, 9:20
- - zuze   Цитата(lanz @ 4.4.2013, 9:20) Т.е. картин...   4.4.2013, 9:24
- - lanz   ЦитатаА как это поправить? Нужно картинку сгенери...   4.4.2013, 9:50
- - zuze   Цитата(lanz @ 4.4.2013, 9:50) Может он и ...   4.4.2013, 10:17
- - lanz   Если картинка не успевает обновится за 15 мс (а он...   4.4.2013, 10:37
- - zuze   Цитата(lanz @ 4.4.2013, 10:37) Поэтому и ...   4.4.2013, 10:45
- - lanz   1. Таймер в Qt. Python только вызывает функции. 2....   4.4.2013, 10:57
- - zuze   Цитата(lanz @ 4.4.2013, 10:57) 2. А как б...   4.4.2013, 11:11
- - zuze   Как я понял, мой коде есть ряд ошибок: 1. Код не у...   5.4.2013, 13:46
- - lanz   ЦитатаКод не удовлетворяет модели "модель-пре...   8.4.2013, 8:45
- - zuze   Цитата(lanz @ 8.4.2013, 8:45) Основные то...   8.4.2013, 8:54
- - zuze   Решил проверить время выполнения кода. if self.ui...   8.4.2013, 10:21
- - lanz   Все правильно, подготовка картинки занимает почти ...   8.4.2013, 10:35
- - zuze   Цитата(lanz @ 8.4.2013, 10:35) Картинку н...   8.4.2013, 10:43
- - lanz   Это все понятно, но картинка обновляется только ко...   8.4.2013, 10:51
- - zuze   Цитата(lanz @ 8.4.2013, 10:51) Это все по...   8.4.2013, 11:05
- - lanz   Нет, я о том чтобы убрать вот это if self.ui.chec...   8.4.2013, 11:41
- - zuze   Цитата(lanz @ 8.4.2013, 11:41) Нет, я о т...   8.4.2013, 12:19
- - lanz   Туда, где загружается картинка.   8.4.2013, 12:22
- - zuze   Цитата(lanz @ 8.4.2013, 12:22) Туда, где ...   8.4.2013, 13:14
- - zuze   Цитата(zuze @ 8.4.2013, 10:21) Все правил...   8.4.2013, 14:00
- - lanz   Потому что время замеряется ВНУТРИ одного вызова и...   8.4.2013, 16:03
- - zuze   Цитата(lanz @ 8.4.2013, 16:03) Все зависи...   8.4.2013, 16:11
- - lanz   Это я помню В Qt этот код был не в paintEvent.   8.4.2013, 16:52
- - zuze   Цитата(lanz @ 8.4.2013, 16:52) В Qt этот ...   8.4.2013, 21:12
- - lanz   И в том треде я писал, что надо вынести этот код и...   9.4.2013, 8:25
- - zuze   Цитата(lanz @ 9.4.2013, 8:25) И вообще, н...   9.4.2013, 9:40
- - lanz   Во втором пункте никак не избавиться. С какой ско...   9.4.2013, 13:35
- - zuze   Цитата(lanz @ 9.4.2013, 13:35) С какой ск...   9.4.2013, 13:38
- - lanz   А сколько времени должна рисоваться одна картинка?   10.4.2013, 14:20
- - zuze   Цитата(lanz @ 10.4.2013, 14:20) А сколько...   10.4.2013, 15:55
- - lanz   Очень странные цифры, за 50 мс - это два - три кад...   10.4.2013, 16:21
- - zuze   Цитата(lanz @ 10.4.2013, 16:21) зачем пер...   11.4.2013, 15:16
- - zuze   Сделал так: data = a.tostring() im = QtGu...   15.4.2013, 13:06
- - lanz   Ошибка при работе с памятью скорее всего, видимо с...   15.4.2013, 13:55
- - zuze   Цитата(lanz @ 15.4.2013, 13:55) Выложите ...   15.4.2013, 14:25
- - lanz   1. Не нужно вызывать update в методе paintEvent эт...   15.4.2013, 16:43
- - zuze   Я сделал так: # -*- coding: utf-8 -*- from Py...   16.4.2013, 8:44
- - lanz   ЦитатаЯ незнаю как сделать im локально, так как я ...   16.4.2013, 9:46
- - zuze   Цитата(lanz @ 16.4.2013, 9:46) Не надо де...   16.4.2013, 10:07
- - lanz   Конечно. Загружаете 720*492 байт, а картинке говор...   16.4.2013, 10:23
- - zuze   Цитата(lanz @ 16.4.2013, 10:23) Конечно. ...   16.4.2013, 10:36
- - lanz   Можно использовать Format_Indexed8, только нужно о...   16.4.2013, 11:29
- - zuze   Цитата(lanz @ 16.4.2013, 11:29) Можно исп...   16.4.2013, 12:21
- - lanz   setColorTable нужно вызывать у конкретного экземпл...   16.4.2013, 12:48
- - zuze   Цитата(lanz @ 16.4.2013, 12:48) setColorT...   16.4.2013, 13:00
- - lanz   im = QtGui.QImage(data, 492, 720, QtGui.QImage...   16.4.2013, 13:59
- - zuze   Цитата(lanz @ 16.4.2013, 13:59) И как эти...   16.4.2013, 14:07
- - lanz   ЦитатаПервый байт после управляющих символов - это...   16.4.2013, 14:36
- - zuze   Цитата(lanz @ 16.4.2013, 14:36) Вопрос - ...   16.4.2013, 14:41
- - lanz   У меня все отрисовывается без ошибок. Возможно про...   16.4.2013, 15:42
- - zuze   lanz, прошу прощения, что не отвечал, был в отпуск...   7.5.2013, 10:53
- - lanz   С выводом картинки, насколько я понял проблем нет....   14.5.2013, 9:30


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 26.11.2024, 1:03