Найти - Пользователи
Полная версия: PyGTK-Cairo:Кроссплатформенный анимированный осциллограф
Начало » GUI » PyGTK-Cairo:Кроссплатформенный анимированный осциллограф
1
leonid_10
Вот тут увидел туториал по работе с Cairo и GTK:
http://www.programmersforum.ru/showthread.php?t=59858
Переписал код на Питоне. Если использую в последнем цикле (#рисуем синусоиду) while self.t < 600, как там, то получаю картинку, как на скриншоте, но никакой анимации не наблюдаю. Если заменяю while на if self.t < 600, то получаю анимацию, но обновляется весь контекст, и наблюдается перемещение только последней линии, и я никак не могу узнать, что нужно сделать, чтобы предыдущие линии оставались. Т.е. нужно, чтобы с обновлением окна контекст накапливался. Как сделать? Это, вероятно, знают те, кто умеет работать с Cairo.

Код:
#!/usr/bin/python
# coding:utf-8

import gtk
import glib
import cairo
from math import sin

class PyApp(gtk.Window):

def __init__(self):

super(PyApp, self).__init__()
self.set_title("Осциллограф")
self.resize(600, 400)
self.set_position(gtk.WIN_POS_CENTER)
self.connect("destroy", gtk.main_quit)
self.darea = gtk.DrawingArea()
self.darea.connect("expose-event", self.expose)
self.add(self.darea)
self.timer = True
glib.timeout_add(10, self.on_timer)
self.show_all()
self.t = 0
self.uAmplit = 900
self.radianPerx = 2 * 3.14 / 90
self.count = 0

def on_timer(self):

if not self.timer: return False
self.darea.queue_draw()
return True

def expose(self, widget, event):

cr = widget.window.cairo_create()
cr.set_line_width(3)
#задаем черный цвет
cr.set_source_rgb(0, 0, 0)
#рисуем линию оси Y
cr.move_to(40, 0)
cr.line_to(40, 350)
cr.stroke()
#рисуем линию оси X
cr.move_to(30, 340)
cr.line_to(600, 340)
cr.stroke()
#задаем толщину линии
cr.set_line_width (0.7)
#рисуем риски на оси X, линии сетки и текстовые метки
xa = 0
while xa < 600:
xa += 40
#задаем черный цвет
cr.set_source_rgb (0, 0, 0)
#рисуем риски
cr.move_to(xa, 333)
cr.line_to(xa, 347)
cr.stroke()
#рисуем вертикальную шкалу
cr.move_to(xa-2, 360)
cr.select_font_face('fixed')
cr.set_font_size(12)
(x, y, width, height, dx, dy) = cr.text_extents(str(xa-40))
cr.show_text(str(xa-40))
#задаем зеленый цвет
cr.set_source_rgb(0, 0.5, 0)
cr.set_line_width (2)
#рисуем линии сетки
cr.move_to(xa+40, 333)
cr.line_to(xa+40, 0)
cr.stroke()
#рисуем риски на оси Y, линии сетки и текстовые метки
ya = 380;
while ya > 0:
ya -= 40
#задаем черный цвет
cr.set_source_rgb(0, 0, 0)
cr.move_to(33, ya)
cr.line_to(47, ya)
cr.stroke()
#рисуем шкалу
cr.move_to (12, ya+2)
cr.select_font_face('fixed')
cr.set_font_size(12)
(x, y, width, height, dx, dy) = cr.text_extents(str(340-ya))
cr.show_text(str(340-ya))
cr.set_source_rgb(0, 0.5, 0)
#рисуем линии сетки
cr.move_to(47, ya-40)
cr.line_to(600, ya-40)
cr.stroke()
#рисуем синусоиду
#задаем красный цвет и толщину линии
cr.set_source_rgb (1, 0, 0)
cr.set_line_width (15)
#устанавливаем начальную точку синусоиды
cr.move_to(self.t+40, ((self.uAmplit * sin(self.t * self.radianPerx + self.count)) * 0.1 + 160))
#рисуем синусоиду
if self.t < 600:
self.t += 1
cr.line_to(self.t+40, ((self.uAmplit * sin(self.t * self.radianPerx + self.count)) * 0.1 + 160))

cr.stroke ()

if self.t == 500:
self.timer = False


PyApp()
gtk.main()
Андрей Светлов
#!/usr/bin/python
# coding:utf-8

import gtk
import glib
import cairo
from math import sin

class PyApp(gtk.Window):

def __init__(self):
super(PyApp, self).__init__()
self.set_title("Осциллограф")
self.resize(600, 400)
self.set_position(gtk.WIN_POS_CENTER)
self.connect("destroy", gtk.main_quit)
self.darea = gtk.DrawingArea()
self.darea.connect("expose-event", self.expose)
self.add(self.darea)
self.timer = True
glib.timeout_add(10, self.on_timer)
self.show_all()
self.t = 0
self.uAmplit = 900
self.radianPerx = 2 * 3.14 / 90
self.count = 0

def on_timer(self):
#if not self.timer: return False
self.t = (self.t + 1) % 500
self.darea.queue_draw()
return True

def expose(self, widget, event):
cr = widget.window.cairo_create()

cr.set_line_width(3)
#задаем черный цвет
cr.set_source_rgb(0, 0, 0)
#рисуем линию оси Y
cr.move_to(40, 0)
cr.line_to(40, 350)
cr.stroke()
#рисуем линию оси X
cr.move_to(30, 340)
cr.line_to(600, 340)
cr.stroke()
#задаем толщину линии
cr.set_line_width (0.7)
#рисуем риски на оси X, линии сетки и текстовые метки
xa = 0
while xa < 600:
xa += 40
#задаем черный цвет
cr.set_source_rgb (0, 0, 0)
#рисуем риски
cr.move_to(xa, 333)
cr.line_to(xa, 347)
cr.stroke()
#рисуем вертикальную шкалу
cr.move_to(xa-2, 360)
cr.select_font_face('fixed')
cr.set_font_size(12)
(x, y, width, height, dx, dy) = cr.text_extents(str(xa-40))
cr.show_text(str(xa-40))
#задаем зеленый цвет
cr.set_source_rgb(0, 0.5, 0)
cr.set_line_width (2)
#рисуем линии сетки
cr.move_to(xa+40, 333)
cr.line_to(xa+40, 0)
cr.stroke()
#рисуем риски на оси Y, линии сетки и текстовые метки
ya = 380;
while ya > 0:
ya -= 40
#задаем черный цвет
cr.set_source_rgb(0, 0, 0)
cr.move_to(33, ya)
cr.line_to(47, ya)
cr.stroke()
#рисуем шкалу
cr.move_to (12, ya+2)
cr.select_font_face('fixed')
cr.set_font_size(12)
(x, y, width, height, dx, dy) = cr.text_extents(str(340-ya))
cr.show_text(str(340-ya))
cr.set_source_rgb(0, 0.5, 0)
#рисуем линии сетки
cr.move_to(47, ya-40)
cr.line_to(600, ya-40)
cr.stroke()
#рисуем синусоиду
#задаем красный цвет и толщину линии
cr.set_source_rgb (1, 0, 0)
cr.set_line_width (3)
#устанавливаем начальную точку синусоиды
cr.move_to(40, 120)
#рисуем синусоиду
for t in xrange(self.t):
x = t + 40
y = self.uAmplit * sin(t * self.radianPerx) * 0.1 + 160
cr.line_to(x, y)

cr.stroke ()


PyApp()
gtk.main()
leonid_10
Андрей, огромное спасибо!!!
Буду теперь производить разбор полётов.
leonid_10
Возникли ещё вопросы. Если я заменяю в этом коде формулы для того, чтоб спираль нарисовать, то спираль рисуется отвратительно. Нужно как-то сделать, чтоб удаляясь от центра линия ломалась всё большее и большее количество раз. Вероятно, в цикл нужно добавить что-то. Непонятная какая-то формула, непонятно, что определяет задаваемый угол.
Вот что я подставляю:
            
cr.move_to(500, 500)
for t in xrange(self.t):
x = (3 * t * cos(t)) + 500
y = (3 * t * sin(t)) + 500
cr.line_to(x, y)
Андрей Светлов
Давайте вы выложите на pastebin.com, а я гляну. Это экономит время
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