Home
Categories
WIKI
Topic
User
LANGUAGE:
中文
English
cairo学习笔记(初级入门)
社区开发
3743
views ·
5
replies ·
To
floor
Go
z85525006
deepin
2012-02-15 08:26
Author
#!/usr/bin/env python
# coding:utf-8
import gtk
class App:
def __init__ (self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.add_events(gtk.gdk.BUTTON_PRESS_MASK)
window.connect("expose_event", lambda w,e:self.on_expose_event(w,e))
window.connect("destroy", lambda w:gtk.main_quit())
window.show_all()
gtk.main()
def on_expose_event(self, widget, event,data=None):
cr = widget.window.cairo_create()
cr.set_source_rgb(0, 0, 0)
cr.set_line_width(100)
#画线段的起点和终点
cr.move_to(12,12)
cr.line_to(12,52)
cr.stroke()
return True
App()
Copy the Code
==========================================
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
class App:
def __init__ (self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.add_events(gtk.gdk.BUTTON_PRESS_MASK)
window.connect("expose_event", lambda w,e:self.expose_event(w,e))
window.connect("destroy", lambda w:gtk.main_quit())
window.show_all()
gtk.main()
def expose_event(self, widget, event):
cr = widget.window.cairo_create()
rect = widget.allocation
#宽度
cr.set_line_width(9)
#
cr.arc(rect.width/2, rect.height/2, rect.width/2-10, 0,2*1.14)
#stroke_preserve函数将它绘制的路径保存在cairo环境中
#描绘stroke绘制形状的轮廓.
cr.set_source_rgb(0.3, 0.4, 0.6)
cr.stroke_preserve()
#填充fill 向形状内部灌注颜色
cr.set_source_rgb(0.69, 0.19, 0)
cr.fill()
#注:
# cr.stroke_preserve () 函数会将它绘制的路径依然保存在 cairo 环境中,
#而 cr.stroke () 所绘制的路径,在绘制完成后,就从 cairo的环境中清除了
return True
App()
Copy the Code
产生疑问: 什么情况下使用cr.stroke_preserve和cr.stroke? 如何灵活的使用,需要注意什么?(明天问王勇同学)
:
(王勇)答:
======================================
虚线 (Dash)
每条线都可以用不同的虚线笔 (dash pen) 来画。虚线模式是通过 cairo_set_dash () 函数来设定。模式类型通过一个数组来定义,数组中的值均为正数,它们用于设置虚线的虚部分与实部分。数组的长度与偏移量可以在程序中设定。如果数组的长度 为 0,虚线模式就是被禁止了,那所绘制的线是实线。如果数组长度为 1,则对应着虚实均匀分布的虚线模式。偏移量是用来设置在虚线的始端在一个虚线周期(包含一个实部单元和一个虚部单元)内的起始位置。
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
#虚线 dash
class App:
def __init__ (self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.add_events(gtk.gdk.BUTTON_PRESS_MASK)
window.connect("expose_event", lambda w,e:self.expose_event(w,e))
window.connect("destroy", lambda w:gtk.main_quit())
window.show_all()
gtk.main()
def expose_event(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgba(0, 0, 0.1)
cr.set_line_width(15)
cr.set_dash([4.0,1.0],0)
cr.move_to(40,60)
cr.line_to(360, 360)
cr.stroke()
return True
App()
Copy the Code
虚线=========
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
#虚线 dash
class App:
def __init__ (self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.add_events(gtk.gdk.BUTTON_PRESS_MASK)
window.add_events(gtk.gdk.BUTTON_PRESS_MASK)
window.add_events(gtk.gdk.BUTTON_RELEASE_MASK)
window.add_events(gtk.gdk.POINTER_MOTION_MASK)
window.connect("expose_event", lambda w,e:self.expose_event(w,e))
window.connect("button-press-event", lambda w,e:self.press_event(w,e))
window.connect("button-release-event", lambda w,e:self.release_event(w,e))
window.connect("motion-notify-event", lambda w,e:self.motion_event(w,e))
window.connect("destroy", lambda w:gtk.main_quit())
self.state = 0
self.x = 0
self.y = 0
window.show_all()
gtk.main()
def motion_event(self, widget, event):
if self.state == 1:
cr = widget.window.cairo_create()
cr.set_source_rgba(1, 0, 0)
cr.set_line_width(5)
cr.move_to(self.x, self.y)
cr.line_to(event.x, event.y)
cr.stroke()
self.x = event.x
self.y = event.y
def release_event(self, widget, event):
self.state = 0
def press_event(self, widget, event):
if event.button == 1:
self.state = 1
self.x = event.x
self.y = event.y
def expose_event(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgba(0, 0, 0.1)
cr.set_line_width(5)
cr.set_dash([5,15, 15, 14,12,32,23], 4)
cr.move_to(40,60)
cr.line_to(360, 360)
cr.stroke()
return True
App()
Copy the Code
线帽 (Line caps)====
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
#虚线 dash
class App:
def __init__ (self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("expose_event", lambda w,e:self.expose_event(w,e))
window.connect("destroy", lambda w:gtk.main_quit())
window.show_all()
gtk.main()
def expose_event(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgba(0, 0, 0, 1)
#设置线的宽度为 10px
cr.set_line_width(10)
#线帽 (Line caps)
#cairo.LINE_CAP_SQUARE 头: 正的
#cairo.LINE_CAP_ROUND 头: 半圆
#cairo.LINE_CAP_BUTT 头: 无
cr.set_line_cap(cairo.LINE_CAP_BUTT)
cr.move_to(40, 60)
cr.line_to(360, 60)
cr.stroke()
cr.set_line_cap(cairo.LINE_CAP_ROUND) #半圆
cr.move_to(40, 140)
cr.line_to(360, 150)
cr.stroke()
cr.set_line_cap(cairo.LINE_CAP_SQUARE) #方形
cr.move_to(40, 240)
cr.line_to(360, 240)
cr.stroke()
cr.set_line_width(1.5)
cr.move_to(40, 40)
cr.line_to(40, 260)
cr.stroke()
cr.move_to(360, 40)
cr.line_to(360,260)
cr.stroke()
cr.move_to(365, 40)
cr.line_to(365, 260)
cr.stroke()
return True
App()
Copy the Code
http://liyanrui.is-programmer.co ... torial-04.7729.html
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
#虚线 dash
class App:
def __init__ (self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("expose_event", lambda w,e:self.expose_event(w,e))
window.connect("destroy", lambda w:gtk.main_quit())
window.show_all()
def expose_event(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgb(0.1, 0, 0)
# x,y,宽,高
cr.rectangle(30, 30, 100, 100)
cr.set_line_width(14)
# 线的交合(line joins)
# cairo.LINE_JOIN_MITER
# cairo.LINE_JOIN_BEVEL
# cairo.LINE_JOIN_ROUND
cr.set_line_join(cairo.LINE_JOIN_MITER)
cr.stroke()
cr.rectangle(160, 30, 100, 100)
cr.set_line_width(14)
cr.set_line_join(cairo.LINE_JOIN_BEVEL)
cr.stroke()
cr.rectangle(100, 160, 100, 100)
cr.set_line_width(14)
cr.set_line_join(cairo.LINE_JOIN_ROUND)
cr.stroke()
return True
App()
gtk.main()
Copy the Code
渐变
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
#虚线 dash
class App:
def __init__ (self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("图片处理")
window.set_default_size(270, 270)
window.connect("expose_event", lambda w,e:self.on_expose_event(w,e))
window.connect("destroy", lambda w:gtk.main_quit())
self.surface1 = cairo.ImageSurface.create_from_png("/home/long/图片/linux.png")
self.surface2 = cairo.ImageSurface.create_from_png("/home/long/图片/linux.png")
self.surface3 = cairo.ImageSurface.create_from_png("/home/long/图片/linux.png")
self.surface4 = cairo.ImageSurface.create_from_png("/home/long/图片/linux.png")
window.set_default_size(300, 300)
window.set_app_paintable(True)
window.show_all()
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
rect = widget.allocation
pattern1 = cairo.SurfacePattern(self.surface1)
pattern2 = cairo.SurfacePattern(self.surface2)
pattern3 = cairo.SurfacePattern(self.surface3)
pattern4 = cairo.SurfacePattern(self.surface4)
#图案 pattern
cr.set_source(pattern1)
cr.get_source().set_extend(cairo.EXTEND_REPEAT)
cr.rectangle(20, 20, 100, 100)
cr.fill()
cr.set_source(pattern2)
cr.get_source().set_extend(cairo.EXTEND_REPEAT)
cr.rectangle(20, 140, 100, 100)
cr.fill()
cr.set_source(pattern3)
cr.get_source().set_extend(cairo.EXTEND_REPEAT)
cr.arc(200, 70, 50, 0, 2*3.14)
cr.fill()
#渐变 Gradline
pat1 = cairo.LinearGradient(0.0, 0.0, 350.0, 350.0)
count = 1
j = 0.1
while j<1:
if count % 2:
pat1.add_color_stop_rgb(j, 0, 0, 1)
else:
pat1.add_color_stop_rgb(j, 1, 0, 0)
j += 0.1
count += 1
cr.rectangle(20, 20, 300, 300)
cr.set_source(pat1)
cr.fill()
pat2 = cairo.LinearGradient(0.0, 0.0, 350.0, 0.0)
i = 0.05
count = 1
while i<0.95:
if count % 2:
pat2.add_color_stop_rgb(i, 0, 0, 0)
else:
pat2.add_color_stop_rgb(i, 0, 0, 1)
count += 1
i += 0.025
cr.rectangle(20, 140, 300, 100)
cr.set_source(pat2)
cr.fill()
pat3 = cairo.LinearGradient(20.0, 260.0, 20.0, 360.0)
pat3.add_color_stop_rgb(0.1, 0, 0, 0)
pat3.add_color_stop_rgb(0.5, 1, 1, 0)
pat3.add_color_stop_rgb(0.9, 0, 0, 0)
cr.rectangle(20, 260, 300, 100)
cr.set_source(pat3)
cr.fill()
App()
gtk.main()
Copy the Code
透明
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
class App:
def __init__ (self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("透明")
window.set_default_size(270, 270)
darea = gtk.DrawingArea()
window.add(darea)
darea.connect("expose_event", lambda w,e:self.on_expose_event(w,e))
window.connect("destroy", lambda w:gtk.main_quit())
#加载图片
self.image = cairo.ImageSurface.create_from_png("/home/long/图片/linux.png")
self.width = self.image.get_width()
self.height = self.image.get_height()
self.alpha = 1
self.dalta = 0.01
window.set_default_size(300, 300)
window.set_app_paintable(True)
self.timeID = gtk.timeout_add(50, self.time_handler, window)
window.show_all()
def time_handler(self, widget):
#if widget.window == None:
# return False
widget.queue_draw()
return True
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
i = 1
while i <=10:
cr.set_source_rgba(0, 0, 1, i*0.1)
cr.rectangle(50*i, 20, 40, 40)
cr.fill()
i += 1
cr.set_source_surface(self.image, 10, 10)
cr.paint_with_alpha(self.alpha)
self.alpha -= self.dalta
if self.alpha <= 0:
self.alpha = 1
return True
App()
gtk.main()
Copy the Code
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
class App:
def __init__ (self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("等待的演示")
window.set_default_size(270, 270)
window.set_default_size(300, 300)
window.set_position(gtk.WIN_POS_CENTER)
self.darea = gtk.ProgressBar()
self.count = 1
self.darea.connect("expose_event", lambda w,e:self.on_expose_event(w,e))
window.connect("destroy", lambda w:gtk.main_quit())
self.time_ID = gtk.timeout_add(100, self.time_handler,window)
window.add(self.darea)
window.show_all()
def time_handler(self, widget):
widget.queue_draw()
self.count += 1
print 'fsdfds'
return True
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
rect = widget.allocation
trs = [
[0.0, 0.15, 0.30, 0.5, 0.65, 0.80, 0.9, 1.0],
[1.0, 0.0, 0.15, 0.30, 0.5, 0.65, 0.8, 0.9],
[0.9, 1.0, 0.0, 0.15, 0.3, 0.5, 0.65, 0.8],
[0.8, 0.9, 1.0, 0.0, 0.15, 0.3, 0.5, 0.65],
[0.65, 0.8, 0.9, 1.0, 0.0, 0.15, 0.3, 0.5],
[0.5, 0.65, 0.8, 0.9, 1.0, 0.0, 0.15, 0.3],
[0.3, 0.5, 0.65, 0.8, 0.9, 1.0, 0.0, 0.15],
[0.15, 0.3, 0.5, 0.65, 0.8, 0.9, 1.0, 0.0]
]
#设置坐标
cr.translate(rect.width/2, rect.height/2)
self.i = 0
while self.i<8:
cr.set_line_width(3)
# ROUND 半圆
cr.set_line_cap(cairo.LINE_CAP_ROUND)
cr.set_source_rgba(0, 0, 0, trs[self.count%8][self.i])
cr.move_to(0.0, -10.0)
cr.line_to(0.0, -40.0)
#旋转变换, 每次在前一次的基础上继续逆时旋转 X 角度...
cr.rotate(3.14/4)
cr.stroke()
self.i += 1
return True
App()
gtk.main()
Copy the Code
===============
合成 (Compositing) 可以将一些单独的源 (source) 所生成可视元素组合成到单幅图像中去,主要用于创建所有的可视元素作为同一场景的一部分这
样一种假象。合成在电影工业中被广为使用,用于创建人群、不寻常的世界等画面,因为这样的画面在现实中的制作代价非常昂贵甚至难以实现。
Cairo 图形库提供了 14 种不同的合成操作。
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("等待的演示")
window.set_default_size(800, 600)
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
window.connect("expose-event", lambda w,e:self.on_expose_event(w,e))
window.connect("destroy", lambda w:gtk.main_quit())
self.x = 20
# window.add(self.darea)
window.show_all()
def on_expose_event(self, widget, event):
oper = [cairo.OPERATOR_DEST_OVER,
cairo.OPERATOR_DEST_IN,
cairo.OPERATOR_OUT,
cairo.OPERATOR_ADD,
cairo.OPERATOR_ATOP,
cairo.OPERATOR_DEST_ATOP]
width, height = widget.get_size()
cr = widget.window.cairo_create()
for i in oper:
self.draw(cr, self.x, width, height, i)
self.x += 80
return True
def draw(self, cr, x, w, h, op):
#cairo.CONTENT_COLOR
#cairo.CONTENT_ALPHA
#cairo.CONTENT_COLOR_ALPHA
first = cr.get_target().create_similar(cairo.CONTENT_COLOR_ALPHA,w,h)
second = cr.get_target().create_similar(cairo.CONTENT_COLOR_ALPHA,w,h)
first_cr = cairo.Context(first)
first_cr.set_source_rgb(0, 0, 0.4)
first_cr.rectangle(x, 20, 50, 50)
first_cr.fill()
second_cr = cairo.Context(second)
second_cr.set_source_rgb(0.5, 0.5, 0)
second_cr.rectangle(x+10, 40, 50, 50)
second_cr.fill()
first_cr.set_operator(op)
first_cr.set_source_surface(second, 0, 0)
first_cr.paint()
cr.set_source_surface(first, 0, 0)
cr.paint()
App()
gtk.main()
Copy the Code
=======================================
裁剪(Clipping)与遮蔽(Masking)
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
import random
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("等待的演示")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
self.image = cairo.ImageSurface.create_from_png("/home/long/图片/aabb.png")
self.width = self.image.get_width()
self.height = self.image.get_height()
window.set_default_size(self.width, self.height)
window.connect_after("expose-event", lambda w,e:self.on_expose_event(w,e))
window.connect("destroy", lambda w:gtk.main_quit())
self.pos_x = 128
self.pos_y = 128
self.radius = 40
self.delta = [3,3]
window.set_app_paintable(True)
self.time_ID = gtk.timeout_add(10, self.time_handler, window)
window.show_all()
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
width, height = widget.get_size()
if self.pos_x < 0 + self.radius:
self.delta[0] = random.randint(0,3) + 5
print self.pos_x
elif self.pos_x > width - self.radius:
self.delta[0] = -(random.randint(0,3) + 5)
print self.pos_y
if self.pos_y < 0 + self.radius:
self.delta[1] = random.randint(0,3) + 5
print self.pos_y
elif self.pos_y > height - self.radius:
self.delta[1] = -(random.randint(0,3) + 5)
print self.pos_y
self.pos_x += self.delta[0]
self.pos_y += self.delta[1]
cr.set_source_surface(self.image, 1, 1)
cr.arc(self.pos_x, self.pos_y, self.radius, 0, 2*3.14)
cr.clip()
cr.paint()
return True
def time_handler(self, widget):
widget.queue_draw()
return True
App()
gtk.main()
Copy the Code
======================
裁剪矩形
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
import random
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("裁剪矩形")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
window.set_default_size(200, 300)
self.rotate = 0
self.counter = 0
self.xdirection = True
self.bigx = 20
self.bigy = 200
self.delta = 1
window.connect("destroy", lambda w:gtk.main_quit())
window.connect_after("expose-event", lambda w,e:self.on_expose_event(w,e))
window.set_app_paintable(True)
window.show_all()
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
self.width, self.height = widget.get_size()
self.counter += 1
if self.bigx > self.width:
self.xdirection = False
self.delta = -self.dalta
self.bigx = self.width
if self.bigx < 1:
self.bigx = 1
self.delta = -self.delta
if self.bigy > self.height:
self.xdirection = True
self.delta = -self.delta
self.bigy = self.height
if self.bigy < 1:
self.delta = -self.delta
self.bigy = 1
if self.xdirection:
self.bigx += self.delta
else:
self.bigy += self.delta
cr.translate(self.width/2, self.height/2)
cr.rectangle(-self.bigx/2, -self.bigy/2, self.bigx-2, self.bigy-2)
cr.set_source_rgb(0, 0, 0)
cr.set_line_width(1)
cr.stroke()
cr.rotate(self.rotate)
self.rotate += 0.01
cr.rectangle(-50, -25, 100, 50)
cr.stroke()
bigrect = gtk.gdk.Rectangle()
bigrect.x = -self.bigx/2
bigrect.y = -self.bigy/2
bigrect.width = self.bigx - 2
bigrect.height = self.bigy - 2
rect = gtk.gdk.Rectangle()
rect.x = -50
rect.y = -25
rect.width = 100
rect.height = 50
intersect1 = gtk.gdk.Rectangle()
intersect1.intersect(bigrect)
intersect1.intersect(rect)
cr.rectangle(intersect1.x, intersect1.y, intersect1.width, intersect1.height)
cr.fill()
return True
App()
gtk.main()
Copy the Code
==================
遮蔽
因为在源被用于外观之前,首先要被过滤。遮蔽可作为一种过滤器。遮蔽用于决定源的哪部分要被显示,哪部分不可被显示。遮蔽的不透明部分允许将源复制到外观,透明部分则不允许将源复制给外观。
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
import random
#遮蔽
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("遮蔽")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
window.set_default_size(200, 300)
window.connect("destroy", lambda w:gtk.main_quit())
window.connect_after("expose-event", lambda w,e:self.on_expose_event(w,e))
window.set_app_paintable(True)
window.show_all()
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgb(0, 0, 0)
self.image = cairo.ImageSurface.create_from_png("/home/long/图片/linuxdeepin.png")
cr.mask_surface(self.image, 0, 0)
cr.fill()
return True
App()
gtk.main()
Copy the Code
========================================================================
这一篇讲述变换(Transformation)仿射变换是由一些线性变换与平移构成的。线性变换
可以写为单个矩阵的形式。旋转是让一个刚体绕一点运动的变换。缩放变换是让物体的形
状扩大与减小,并且在各个方向上的缩放因子都相同。平移变换将每个点沿着指定的方向
移动常量距离。错切对于给定轴线,沿垂直于它的方向对物体进行移动的变换,并且在轴
线的一侧的移动距离大于另一侧。
平移
#平移
cr = widget.window.cairo_create()
cr.set_source_rgb(0.6, 0.6, 0.6)
cr.rectangle(20, 20, 80, 50)
cr.stroke_preserve()
cr.set_source_rgb(1, 1, 1)
cr.fill()
cr.translate(100, 100)
cr.set_source_rgb(0.6, 0.6, 0.6)
cr.rectangle(20, 20, 80, 50)
cr.stroke_preserve()
cr.set_source_rgb(1, 1, 1)
cr.fill()
#旋转
cr.set_source_rgb(0.6, 0.6, 0.6)
cr.rectangle(20, 20, 80, 50)
cr.stroke_preserve()
cr.set_source_rgb(1, 1, 1)
cr.fill()
cr.translate(150, 100) #平移
cr.rotate(3.14/2)#旋转180
cr.set_source_rgb(0.6, 0.6, 0.6)
cr.rectangle(20,20, 80, 50)
cr.stroke_preserve()
cr.set_source_rgb(1, 1, 1)
cr.fill()
Copy the Code
\
缩放
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
import random
#缩放
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("缩放")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
window.set_default_size(300, 300)
window.connect("destroy", lambda w:gtk.main_quit())
window.connect_after("expose-event", lambda w,e:self.on_expose_event(w,e))
window.set_app_paintable(True)
window.show_all()
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
#缩放
cr.save() #初始的变换矩阵保存一下. 通过 save, restore
cr.set_source_rgb(0.6, 0.6, 0.6)
cr.rectangle(20, 30, 80, 50)
cr.stroke_preserve()
cr.set_source_rgb(1, 1, 1)
cr.fill()
cr.restore()
cr.save()
cr.translate(130, 30)
cr.scale(0.7, 0.7)
cr.set_source_rgb(0.6, 0.6, 0.6)
cr.rectangle(0, 0, 80, 50)
cr.stroke_preserve()
cr.set_source_rgb(1, 1, 1)
cr.fill()
cr.restore()
cr.save()
cr.translate(220, 30)
cr.scale(1.5, 1.5)
cr.set_source_rgb(0.6, 0.6, 0.6)
cr.rectangle(0, 0, 80, 50)
cr.stroke_preserve()
cr.set_source_rgb(1, 1, 1)
cr.fill()
cr.restore() #恢复前面用 save保存下来的图形. 有点想 出栈的感觉
return True
App()
gtk.main()
Copy the Code
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
import random
#错切
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("错切")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
window.set_default_size(300, 300)
window.connect("destroy", lambda w:gtk.main_quit())
window.connect_after("expose-event", lambda w,e:self.on_expose_event(w,e))
window.set_app_paintable(True)
window.show_all()
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
matrix = cairo.Matrix(1.0, 0.5,
0.0, 1.0,
0.0, 0.0)
cr.save()
cr.set_source_rgb(0.6, 0.6, 0.6)
cr.rectangle(20, 30, 80, 50)
cr.stroke_preserve()
cr.set_source_rgb(1, 1, 1)
cr.fill()
cr.restore()
cr.save()
cr.translate(130, 30)
cr.transform(matrix) #用户空间轴转换矩阵
cr.set_source_rgb(0.6, 0.6, 0.6)
cr.rectangle(0, 0, 80, 50)
cr.set_source_rgb(1, 1, 1)
cr.fill()
cr.restore()
cr.save()
cr.translate(220, 30)
#class cairo.Matrix(xx = 1.0, yx = 0.0, xy = 0.0, yy = 1.0, x0 = 0.0, y0 = 0.0)
#x_new = xx * x + xy * y + x0
#y_new = yx * x + yy * y + y0
#x_new =
#matrix = cairo.Matrix(1.0, 0.0,
# 0.0, 1.0,
# 0.0, 0.0)
#对照看下,发现什么问题没有, 看下 对角方向的参数. 1.0 1.0 0.0 0.0
matrix = cairo.Matrix(2.0, 1.0,
1.0, 3.0,
5.0, 10.0)
cr.transform(matrix)
cr.set_source_rgb(0.6, 0.6, 0.6)
cr.rectangle(0, 0, 80, 50)
cr.stroke_preserve()
cr.set_source_rgb(1, 1, 1)
cr.fill()
cr.restore()
#代码实现了两次错切变换,对于错切变换没有特定函数,必须使用矩阵来实现. 看原作者给出来的坐标.
#我的矩阵学的也不好,只是上课的时候听过,哎.各位python爱好者,往高处跑,还是要学好底层和数学啊.T_T
# cairo.Matrix 是存储防射变换的数据结构.
return True
App()
gtk.main()
Copy the Code
椭圆
下面的这个例子,画了一个灰常复杂的形状,它由一串旋转的椭圆形成。
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
import random
#椭圆
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("椭圆")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
window.set_default_size(300, 300)
self.i = 0
window.connect("destroy", lambda w:gtk.main_quit())
window.connect_after("expose-event",
lambda w,e:self.on_expose_event(w,e))
window.set_app_paintable(True)
window.show_all()
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
width, height = widget.get_size()
#画线宽度
cr.set_line_width(0.5)
#画正方形
cr.translate(width/2, height/2)
#画圆
cr.arc(0, 0, 120, 0, 2*3.14)
cr.stroke()
cr.save()
for i in range(0, 36):
cr.rotate(i*3.14/36)#旋转
cr.scale(0.3, 1) #缩放
cr.arc(0, 0, 120, 0, 2*3.14)
cr.restore() #恢复前面保存的画图
cr.stroke()
cr.save()
return True
App()
gtk.main()
Copy the Code
沿着边界圆画 36 个椭圆。椭圆可用圆的缩放变换而获得。旋转这个椭圆,这样就创建了一个有趣的形状
#!/usr/bin/env python
# coding:utf-8
#星星
#下面的示例绘制了一个又旋转又缩放的星星,可惜不会发光呃。
#
import cairo
import gtk
import random
#星星
points = [[0, 85],
[75, 75],
[100, 10],
[125, 75],
[200, 85],
[150, 125],
[160, 190],
[100, 150],
[40, 190],
[50, 125],
[0, 85]]
class App(object):
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_position(gtk.WIN_POS_CENTER)
window.set_title("星星")
window.set_position(gtk.WIN_POS_CENTER)
window.set_app_paintable(True)
window.set_default_size(300, 300)
window.connect("destroy", lambda w:gtk.main_quit())
window.connect_after("expose-event",
lambda w,e:self.on_expose_event(w,e))
self.timeout_ID = gtk.timeout_add(10, self.time_handler, window)
self.angle = 0
self.scale = 1
self.delta = 0.01
window.set_app_paintable(True)
window.show_all()
def time_handler(self, widget):
widget.queue_draw()
return True
def on_expose_event(self, widget, event):
width, height = widget.get_size()
cr = widget.window.cairo_create()
cr.set_source_rgb(0, 0.44, 0.7)
cr.set_line_width(1)
cr.translate(width/2, height/2) #平移
cr.rotate(self.angle)#旋转
#cr.scale(self.scale, self.scale) #缩放
cr.scale(0.2,0.2)
for i in range(0, 10):
cr.line_to(points[i][0], points[i][1])
cr.close_path()
cr.fill()
cr.stroke()
#if self.scale < 0.01:
# self.delta = -self.delta
#elif self.scale > 0.99:
# self.delta = -self.delta
#self.scale += self.delta
self.angle += 0.01
#这里的旋转和平移没有什么悬念了,就是这样了
#看看缩放 < 0.01 和 > 0.99的时候.
#就是这个 scale有作用. 缩小,放大,
return True
App()
gtk.main()
Copy the Code
最后来一个总的例子:
去画歌词.
import gtk
import cairo
import pangocairo
import pango
import gobject
TEST_LRC = "深度影音播放器 歌词测试播放"
INIT_FONT_TYPE = "文泉驿等宽微米黑"
INIT_FONT_SIZE = 25
class Lrc(gobject.GObject):
__gsignals__ = {
"lrc-changed" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
())
}
def __init__(self):
gobject.GObject.__init__(self)
self.pango_list = pango.AttrList()
self.lrc_text = ""
self.end_index = 0
self.offset_x = 0
self.alpha = 0.5
self.time_delay = 250
self.show_lrc_bool = True
self.timeout_add_bool = True
self.timeout_add_id = None
self.init_font()
def start_lrc(self):
self.timeout_add_bool = True
def stop_lrc(self):
self.timeout_add_bool = False
def init_timeout(self, time_delay=0):
if self.timeout_add_id:
gtk.timeout_remove(self.timeout_add_id) # remove timeout id.
self.time_delay = time_delay
self.timeout_add_id = gtk.timeout_add(self.time_delay, self.draw_lrc_timeout_add)
def draw_lrc_timeout_add(self):
self.pango_list.insert(pango.AttrForeground(65535, 0, 0, 0, self.end_index))
# self.end_index += 1
self.offset_x += 10
self.emit("lrc-changed")
return self.timeout_add_bool
def init_font(self, font_type=INIT_FONT_TYPE, font_size=INIT_FONT_SIZE):
self.font_type = font_type
self.font_size = font_size
def show_text(self, lrc_text):
self.lrc_text = lrc_text
self.emit("lrc-changed")
def expose_lrc_text_function(self, cr):
if self.show_lrc_bool:
# cr.set_source_rgb(0, 0, 0)
self.draw_lrc_text(self.lrc_text, cr)
def draw_lrc_text(self, ch, cr, init_fg_color="#FF0000"):
context = pangocairo.CairoContext(cr)
layout = context.create_layout()
layout.set_font_description(pango.FontDescription("%s %s" % (self.font_type, self.font_size)))
# Set font position.
cr.set_source_rgb(1, 0, 0)
layout.set_text(ch)
layout.set_attributes(self.pango_list)
ch_width, ch_height = layout.get_pixel_size()
cr.move_to(0, 0)
#########################
cr.save()
#########################
cr.layout_path(layout) #
# Set font rgb.
cr.set_source_rgba(0, 0.5, 0.5)
# if #draw 填充的字体.
cr.set_line_width(5) # 设置宽
cr.stroke_preserve() # 保存绘制的路径
cr.set_source_rgba(0, 1, 0)
cr.fill()
# else 里面空的字体.
# cr.stroke()
#######################
cr.restore()
#######################
cr.save()
cr.new_path()
pattern = cairo.LinearGradient(self.offset_x, 0.0,
self.offset_x, ch_height )
pattern.add_color_stop_rgba(0, 0.5, 1.0, 0.5, 1.0)
pattern.add_color_stop_rgba(0.5, 0.5, 0.5, 0.5, 1.0)
pattern.add_color_stop_rgba(1.0, 0.1, 0.5, 0.1, 1.5)
cr.set_source(pattern)
cr.set_operator(cairo.OPERATOR_OVER)
cr.move_to(0, 0)
##############################
# Show font.
context.show_layout(layout)
cr.restore()
if __name__ == "__main__":
def test_osd_lrc_function(widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgba(1.0, 1.0, 1.0, 0.1)
cr.set_operator(cairo.OPERATOR_SOURCE)
cr.paint()
lrc.expose_lrc_text_function(cr)
return True
def active_expose_window(LRC):
win.queue_draw()
def modify_lrc_time(widget):
pass
def realize_win(widget):
widget.window.input_shape_combine_region(gtk.gdk.Region(), 0, 0)
widget.window.set_back_pixmap(None, False)
win = gtk.Window(gtk.WINDOW_TOPLEVEL)
win.set_position(gtk.WIN_POS_CENTER)
win.set_size_request(500, 500)
win.set_decorated(False)
win.set_skip_taskbar_hint(True)
win.set_keep_above(True)
win.set_colormap(gtk.gdk.Screen().get_rgba_colormap())
# win.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
win.add_events(gtk.gdk.ALL_EVENTS_MASK)
lrc = Lrc()
lrc.show_text("深度LINUX DEEPIN 深度影音")
lrc.init_timeout(500)
lrc.connect("lrc-changed", active_expose_window)
##############
win.connect("expose-event", test_osd_lrc_function)
win.connect("realize", realize_win) ; 注释掉这行看看, 鼠标是否还可以穿透.
win.show_all()
gtk.main()
Copy the Code
效果如下:
选区_003.png
歌词最简单的实现方式... 如果字幕也能这样,岂不是快哉.
歌词的时间读取只要将前后的时间相减,你明白的.. 小学数学.
总的路程(总的字体宽度), 时间.... 你明白..的!!
#!/usr/bin/env python
# coding:utf-8
import cairo
import gtk
import random
import pango
import pangocairo
#遮蔽
class App(object):
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_position(gtk.WIN_POS_CENTER)
self.window.set_title("遮蔽")
self.window.set_position(gtk.WIN_POS_CENTER)
self.window.set_app_paintable(True)
self.window.set_default_size(200, 300)
self.window.connect("destroy", lambda w:gtk.main_quit())
self.window.connect_after("expose-event", lambda w,e:self.on_expose_event(w,e))
self.window.set_app_paintable(True)
self.window.show_all()
self.i = 0
gtk.timeout_add(100, self.test)
def test(self):
self.i = self.i + 1
self.window.queue_draw()
return True
def on_expose_event(self, widget, event):
cr = widget.window.cairo_create()
# active_surface = self.get_image_surface([1, 1, 1])
# inactive_surface = self.get_image_surface([1, 0, 0])
pangocairo_cr = pangocairo.CairoContext(cr)
layout = pangocairo_cr.create_layout()
layout.set_font_description(pango.FontDescription("%s %s" % ("文泉驿等宽微米黑", 20)))
layout.set_text("深度影音--Linux deepin 12.12")
pangocairo_cr.move_to(0, 0)
pangocairo_cr.set_source_rgb(0, 0, 1)
pangocairo_cr.show_layout(layout)
cr.save()
cr.rectangle(0, 0, self.i, 200)
cr.clip()
cr.set_source_rgb(1, 0, 0)
cr.fill()
pangocairo_cr.set_source_rgb(0, 1, 0)
pangocairo_cr.show_layout(layout)
cr.restore()
return True
App()
gtk.main()
Copy the Code
一起来吧..
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (C) 2012 Deepin, Inc.
# 2012 Hailong Qiu
#
# Author: Hailong Qiu <356752238@qq.com>
# Maintainer: Hailong Qiu <356752238@qq.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
.
import gtk
import cairo
import pangocairo
import pango
import gobject
TEST_LRC = "深度影音播放器 歌词测试播放"
INIT_FONT_TYPE = "文泉驿等宽微米黑"
INIT_FONT_SIZE = 25
class Lrc(gobject.GObject):
__gsignals__ = {
"lrc-changed" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
())
}
def __init__(self):
gobject.GObject.__init__(self)
self.pango_list = pango.AttrList()
self.lrc_text = ""
self.end_index = 0
self.offset_x = 0
self.alpha = 0.5
self.time_delay = 250
self.show_width = 0
self.show_lrc_bool = True
self.timeout_add_bool = True
self.timeout_add_id = None
self.init_font()
def start_lrc(self):
self.timeout_add_bool = True
def stop_lrc(self):
self.timeout_add_bool = False
def init_timeout(self, time_delay=0):
if self.timeout_add_id:
gtk.timeout_remove(self.timeout_add_id) # remove timeout id.
self.time_delay = time_delay
self.timeout_add_id = gtk.timeout_add(self.time_delay, self.draw_lrc_timeout_add)
def draw_lrc_timeout_add(self):
self.pango_list.insert(pango.AttrForeground(65535, 0, 0, 0, self.end_index))
# self.offset_x += 100
self.show_width += 1
self.emit("lrc-changed")
return self.timeout_add_bool
def init_font(self, font_type=INIT_FONT_TYPE, font_size=INIT_FONT_SIZE):
self.font_type = font_type
self.font_size = font_size
def show_text(self, lrc_text):
self.lrc_text = lrc_text
self.emit("lrc-changed")
def expose_lrc_text_function(self, cr):
if self.show_lrc_bool:
# cr.set_source_rgb(0, 0, 0)
self.draw_lrc_text(self.lrc_text, cr)
def draw_lrc_text(self, ch, cr, init_fg_color="#FF0000"):
context = pangocairo.CairoContext(cr)
layout = context.create_layout()
layout.set_font_description(pango.FontDescription("%s %s" % (self.font_type, self.font_size)))
# Set font position.
cr.set_source_rgb(1, 0, 0)
layout.set_text(ch)
layout.set_attributes(self.pango_list)
ch_width, ch_height = layout.get_pixel_size()
cr.move_to(30, 0)
#
cr.save()
cr.layout_path(layout)
# cr.set_source_rgba(1, 0, 0)
# if #draw 填充的字体.
cr.set_line_width(1) # 设置宽
cr.stroke_preserve() # 保存绘制的路径
# cr.set_source_rgba(0, 1, 0)
cr.fill()
# else 里面空的字体.
# cr.stroke()
#
cr.restore()
#
pattern = cairo.LinearGradient(self.offset_x, 0.0,
self.offset_x, ch_height )
pattern.add_color_stop_rgba(0.0, 0.5, 1.0, 0.5, 1.0)
pattern.add_color_stop_rgba(0.5, 0.5, 0.5, 0.5, 1.0)
pattern.add_color_stop_rgba(1.0, 0.1, 0.5, 0.1, 1.5)
cr.set_source(pattern)
cr.set_operator(cairo.OPERATOR_OVER)
#
cr.save()
cr.rectangle(0, 0, self.show_width, 200)
cr.clip()
#
cr.move_to(30, 0)
context.show_layout(layout)
cr.restore()
if __name__ == "__main__":
def test_osd_lrc_function(widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgba(1.0, 1.0, 1.0, 0.1)
cr.set_operator(cairo.OPERATOR_SOURCE)
cr.paint()
lrc.expose_lrc_text_function(cr)
return True
def active_expose_window(LRC):
win.queue_draw()
def modify_lrc_time(widget):
pass
def realize_win(widget):
widget.window.input_shape_combine_region(gtk.gdk.Region(), 0, 0)
widget.window.set_back_pixmap(None, False)
##############################################
win = gtk.Window(gtk.WINDOW_TOPLEVEL)
win.set_position(gtk.WIN_POS_CENTER)
win.set_size_request(500, 500)
win.set_decorated(False)
win.set_skip_taskbar_hint(True)
# win.set_keep_above(True)
win.set_colormap(gtk.gdk.Screen().get_rgba_colormap())
# win.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
win.add_events(gtk.gdk.ALL_EVENTS_MASK)
lrc = Lrc()
lrc.show_text("深度LINUX DEEPIN 深度影音")
lrc.init_timeout(50)
lrc.connect("lrc-changed", active_expose_window)
################################################
win.connect("expose-event", test_osd_lrc_function)
win.connect("realize", realize_win)
win.show_all()
gtk.main()
Copy the Code
选区_004.png
选区_005.png
简单代码编辑器编写: PANGO + CAIRO + GTK+.
自从写了assembly IDE开发环境以后,有一些朋友对里面的代码编辑器很感兴趣,我和他说,我没有你想象中那么厉害,里面东西都比较简单,他说我谦虚了,我无语了。可能是由于他没接触类似的东西,所以有点懵,这个很正常,接触了,就没有那么神秘了.我写这些文章,不是炫耀我懂这些东西,是希望大家也能交流,把你们所学的东西共享出来给大家。哪怕抽一点时间,写一点,也是有益很多人的。大家就互相大家交流吧,由于技术水平有限,有什么不对的地方还请多多指教。
我们先来看PANGO的一个小例子:
将所有东西化简后,就是这样啦. 就像一个大片电影,其实简单将的就是 一个王朝的建立而已,然后扩展起来而已.
#coding:utf-8
import gtk
import pango
import pangocairo
# 这些常量看的很不舒服. 不知道是全局变量还是伪常量.
INIT_FONT_TYPE = "文泉驿等宽微米黑"
INIT_FONT_SIZE = 11
class Test(object):
def __init__(self):
self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.btn = gtk.Button()
self.win.set_size_request(500, 500)
#
# self.btn
#
self.btn.connect("expose-event", self.btn_expose_event)
self.win.add(self.btn)
self.win.show_all()
def btn_expose_event(self, widget, event):
cr = widget.window.cairo_create()
rect = widget.allocation
pango_list = pango.AttrList()
# 设置属性.
r = 65535 # 0 ~ 65535
g = 0
b = 0
start_index = 1
end_index = 3
pango_list.insert(pango.AttrForeground(
r, g, b, start_index, end_index))
r = 0
g = 0
b = 65535
pango_list.insert(pango.AttrBackground(
r, g, b, start_index, end_index))
self.expose_event_text_buffer(cr, rect, pango_list)
return True
def expose_event_text_buffer(self, cr, rect, pango_list):
offset_x = 10
offset_y = 10
context = pangocairo.CairoContext(cr)
layout = context.create_layout() # 创建 layout
layout.set_font_description(pango.FontDescription("%s %s" % (INIT_FONT_TYPE, INIT_FONT_SIZE))) # 设置字体 和字号
layout.set_text("Linux Deepin 深度影音!!")
layout.set_attributes(pango_list) # 设置前景和背景颜色属性.
cr.set_source_rgb(0, 0, 0)
cr.move_to(offset_x, offset_y) # 显示的位置
context.update_layout(layout) # 更新
context.show_layout(layout) # 显示
Test()
gtk.main()
Copy the Code
看完代码后,真的没有那么神秘了,不是吗?
代码编辑器图一.png
词法分析了解:
http://my.oschina.net/hailongqiu/blog/81546
词法分析很简单,每个人都能写出不同的版本,我提醒的就是千万不要忘记写符号表来保存这些关键字的信息.
代码提示的话,原理也很简单,因为我以前写过简单的文件管理器,就是这样的智能补足的.就是将你需要的东西匹配出来就可以啦,然后显示在下拉对话框中.
可以模仿我们最初学习线程的那个例子. 一个在前面处理 输入,一个在后面处理 编辑.
还有一个输入法的管理: GtkIMMulticontext... 详细请查询GTK手册吧.
在LINUX这个世界,高手实在是太多了,对于刚进入LINUX世界的菜鸟的我,以前学的东西都不好在高手们面前显眼,因为我以前学的那些东西在在他们面前时不值得一提的。“菜”,非常菜,所以别人说我的时候,我感觉确实和LINUX的C语言高手差距很大,所以都沉默了。找机会要好好锻炼一下,多看看C语言的开源项目,自己也写一个项目(创造一门语言,将这门语言翻译成NASM,这是我的狂想:http://my.oschina.net/hailongqiu/blog/75072, 但是比这个还要简单的更简单些吧,呵呵),忘记曾经的思维,忘记学校的事情,努力追上C语言高手的水平。
visual python 拖拉界面中的 难题解决:[笔记]
#!coding:utf-8
import gtk
class Test(object):
def __init__(self):
self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.win.set_size_request(500, 500)
self.textview = gtk.TextView()
# self.textview = gtk.Entry()
self.textview.set_size_request(200, 100)
self.win.connect_after("expose-event", self.expose_event_win)
self.fixed = gtk.Fixed()
self.fixed.put(self.textview, 20, 30)
self.win.add(self.fixed)
self.win.show_all()
self.textview.window.set_composited(True)
def expose_event_win(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_pixmap (self.textview.window,
self.textview.allocation.x,
self.textview.allocation.y)
region = gtk.gdk.region_rectangle(self.textview.allocation)
r = gtk.gdk.region_rectangle(event.area)
region.intersect(r)
cr.region (region)
cr.fill()
cr.set_dash([1.0,1.0],0)
cr.set_source_rgba(1, 0, 0, 0.4)
cr.rectangle(0, 0, 200, 200)
cr.stroke()
return True
Test()
gtk.main()
Copy the Code
虚线画.png
Reply
Like 0
Favorite
View the author
All Replies
hfy1991
deepin
2012-02-18 03:43
#1
楼主的内容很受用,PyGTK太不详细了,要是早点看到这篇就好了
Reply
Like 0
View the author
z85525006
deepin
2012-02-18 09:20
#2
楼主的内容很受用,PyGTK太不详细了,要是早点看到这篇就好了
这些内容其实早就出来了.
是C语言版本的,我改写成PYTHON的版本,我作个笔记而已!
:
Reply
Like 0
View the author
z85525006
deepin
2012-02-24 19:03
#3
cr.save()
cr.rectangle(x+1, y, w-2, 1)
cr.rectangle(x, y+1, w, h-2)
cr.rectangle(x+1, h-1, w-2, 1)
cr.clip()
#渐变
#draw_vlinear(cr, x, y, w, h, theme.get_dynamic_shadow_color("progressbarBackground").get_color_info())
cr.restore()
Copy the Code
Reply
Like 0
View the author
z85525006
deepin
2012-09-07 11:12
#4
http://blog.csdn.net/zddmail/article/details/7450033
这是一段高斯的算法....
我们明白, 图片其实 在屏幕就是画了点而已.
汇编读取出来, 也是按照 图片格式的规则去而已.
在屏幕显示就是一个个点画出来的.
Reply
Like 0
View the author
mjwolf
deepin
2012-09-07 21:36
#5
好贴,希望坛中多多有这种技术贴。
Reply
Like 0
View the author
Please
sign
in first
Recommended
Change
Deepin System Updates (2022.6.15)
New Thread
Rankings
7 days
30 days
90 days
1
阿尼樱奈奈
128 posts
2
buyike
106 posts
3
jjcui8595
92 posts
4
晚秋(lateautumn)
57 posts
5
神末shenmo
47 posts
6
Merlin
47 posts
Popular Events
More
(王勇)答:
======================================
虚线 (Dash)
每条线都可以用不同的虚线笔 (dash pen) 来画。虚线模式是通过 cairo_set_dash () 函数来设定。模式类型通过一个数组来定义,数组中的值均为正数,它们用于设置虚线的虚部分与实部分。数组的长度与偏移量可以在程序中设定。如果数组的长度 为 0,虚线模式就是被禁止了,那所绘制的线是实线。如果数组长度为 1,则对应着虚实均匀分布的虚线模式。偏移量是用来设置在虚线的始端在一个虚线周期(包含一个实部单元和一个虚部单元)内的起始位置。
线帽 (Line caps)====
渐变
透明
合成 (Compositing) 可以将一些单独的源 (source) 所生成可视元素组合成到单幅图像中去,主要用于创建所有的可视元素作为同一场景的一部分这
样一种假象。合成在电影工业中被广为使用,用于创建人群、不寻常的世界等画面,因为这样的画面在现实中的制作代价非常昂贵甚至难以实现。
Cairo 图形库提供了 14 种不同的合成操作。
裁剪(Clipping)与遮蔽(Masking)
======================
裁剪矩形
遮蔽
因为在源被用于外观之前,首先要被过滤。遮蔽可作为一种过滤器。遮蔽用于决定源的哪部分要被显示,哪部分不可被显示。遮蔽的不透明部分允许将源复制到外观,透明部分则不允许将源复制给外观。
========================================================================
这一篇讲述变换(Transformation)仿射变换是由一些线性变换与平移构成的。线性变换
可以写为单个矩阵的形式。旋转是让一个刚体绕一点运动的变换。缩放变换是让物体的形
状扩大与减小,并且在各个方向上的缩放因子都相同。平移变换将每个点沿着指定的方向
移动常量距离。错切对于给定轴线,沿垂直于它的方向对物体进行移动的变换,并且在轴
线的一侧的移动距离大于另一侧。
平移
缩放
椭圆
下面的这个例子,画了一个灰常复杂的形状,它由一串旋转的椭圆形成。
最后来一个总的例子:
去画歌词.
选区_003.png
歌词最简单的实现方式... 如果字幕也能这样,岂不是快哉.
歌词的时间读取只要将前后的时间相减,你明白的.. 小学数学.
总的路程(总的字体宽度), 时间.... 你明白..的!!
一起来吧..
选区_004.png
选区_005.png
简单代码编辑器编写: PANGO + CAIRO + GTK+.
自从写了assembly IDE开发环境以后,有一些朋友对里面的代码编辑器很感兴趣,我和他说,我没有你想象中那么厉害,里面东西都比较简单,他说我谦虚了,我无语了。可能是由于他没接触类似的东西,所以有点懵,这个很正常,接触了,就没有那么神秘了.我写这些文章,不是炫耀我懂这些东西,是希望大家也能交流,把你们所学的东西共享出来给大家。哪怕抽一点时间,写一点,也是有益很多人的。大家就互相大家交流吧,由于技术水平有限,有什么不对的地方还请多多指教。
我们先来看PANGO的一个小例子:
将所有东西化简后,就是这样啦. 就像一个大片电影,其实简单将的就是 一个王朝的建立而已,然后扩展起来而已.
代码编辑器图一.png
词法分析了解: http://my.oschina.net/hailongqiu/blog/81546
词法分析很简单,每个人都能写出不同的版本,我提醒的就是千万不要忘记写符号表来保存这些关键字的信息.
代码提示的话,原理也很简单,因为我以前写过简单的文件管理器,就是这样的智能补足的.就是将你需要的东西匹配出来就可以啦,然后显示在下拉对话框中.
可以模仿我们最初学习线程的那个例子. 一个在前面处理 输入,一个在后面处理 编辑.
还有一个输入法的管理: GtkIMMulticontext... 详细请查询GTK手册吧.
在LINUX这个世界,高手实在是太多了,对于刚进入LINUX世界的菜鸟的我,以前学的东西都不好在高手们面前显眼,因为我以前学的那些东西在在他们面前时不值得一提的。“菜”,非常菜,所以别人说我的时候,我感觉确实和LINUX的C语言高手差距很大,所以都沉默了。找机会要好好锻炼一下,多看看C语言的开源项目,自己也写一个项目(创造一门语言,将这门语言翻译成NASM,这是我的狂想:http://my.oschina.net/hailongqiu/blog/75072, 但是比这个还要简单的更简单些吧,呵呵),忘记曾经的思维,忘记学校的事情,努力追上C语言高手的水平。
visual python 拖拉界面中的 难题解决:[笔记]