?
import pygtk
pygtk.require('2.0')
from gtk import gdk
import gtk, gobject, cairo, math, random
from itertools import izip as abrakadabra
class Lines(gtk.DrawingArea):
def __init__(self):
gtk.DrawingArea.__init__(self)
self.connect("expose_event", self.expose)
self.connect("key_press_event", self.on_key_press)
self.add_events( gdk.KEY_PRESS_MASK )
self.set_flags(gtk.CAN_FOCUS)
gobject.timeout_add(20, self.on_timeout)
self.pressed = None
self.middle_P = [0,0]
self.lines = [[0,0]]
self.RGB = [[0,0,0]]
self.n_line = [0,0]
self.n_RGB = [0,0,0]
self.ref =[0,0]
def expose(self, widget, event):
self.cr = widget.window.cairo_create()
self.cr.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
self.draw(*self.window.get_size())
return False
def on_key_press ( self, widget, event ):
self.pressed = event.string
if self.pressed != None:
self.n_line = [z*random.random() for z in self.window.get_size()]
self.lines.append( self.n_line)
self.n_RGB = [random.random(), random.random(), random.random()]
self.RGB.append(self.n_RGB)
self.pressed = None
def on_timeout(self):
if self.middle_P != self.ref:
self.move_lanes()
self.middle_P = [z/2.0 for z in self.window.get_size()]
win = self.get_window()
rect = self.get_allocation()
win.invalidate_rect(rect, False)
return True
def move_lanes(self):
for i in range(0, len(self.lines)):
diff = [xy_p - xy_n for xy_p, xy_n in abrakadabra(self.ref, self.middle_P)]
self.lines[i] = [m_xy + sh_diff for m_xy, sh_diff in abrakadabra(self.lines[i], diff)]
def draw(self, width, height):
self.ref = [(width)/2.0,(height)/2.0]
self.cr.set_source_rgb(.5,.5,.5)
self.cr.rectangle(0, 0, width,height)
self.cr.fill()
self.cr.set_source_rgb(1,0,0)
self.cr.arc(width/2.0, height/2.0, min(width,height)/2.0 - 20.0, 0.0, 2.0*math.pi)
self.cr.stroke()
for i in range(1, len(self.lines)):
self.cr.set_source_rgb(random.random(), random.random(), random.random())
self.cr.move_to(self.middle_P[0], self.middle_P[1])
self.cr.line_to(self.lines[i][0], self.lines[i][1])
self.cr.stroke()
def run(Widget):
window = gtk.Window()
widget = Widget()
window.connect("delete-event", gtk.main_quit)
window.add(widget)
window.show_all()
gtk.main()
if __name__ == "__main__":
run(Lines)
I'm still learning and I would like to know if there is an even more Pythonic way to achieve the same functionality? I mean moving / converting strings continuously unchanged in size while the window is being resized? In addition, I did not see any differences between the built-in zip and itertools.izip in performance, how can I check the time and memory usage of each of these functions?