# get token color. pango_list = pango.AttrList() if text: scan = Scan(self.scan_file_ini, self.code_edit_config_path) for table_color in scan.scan(text[:sum_column], start_row): r, g, b = self.hex_color_to_65535_rgb(table_color.rgb) # set pango list. pango_list.insert( pango.AttrForeground( r, g, b, table_color.start_index, table_color.end_index+1)) def draw_text_source_view_buffer_text_ch(self, ch, cr, offset_x, offset_y, pango_list, init_fg_color ): 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. layout.set_text(ch) layout.set_attributes(pango_list) ch_width, ch_height = layout.get_pixel_size() cr.move_to(offset_x, offset_y) # Set font rgb. cr.set_source_rgb(*self.color_to_rgb(init_fg_color)) # Show font. context.update_layout(layout) context.show_layout(layout) return ch_width
#! /usr/bin/env python# -*- coding: utf-8 -*-import pangoimport pangocairoimport gtkdef draw_text_test(widget, event): cr = widget.window.cairo_create() pango_text = pangocairo.CairoContext(cr) pango_layout = pango_text.create_layout() pango_layout.set_font_description(pango.FontDescription("%s %s" % ("文泉驿微米黑", 10))) str_lien = "\n".join(["#inclue <stdio.h>", "int main(int argc,char argv*)", "{", "int", "long,jkdjf"]) pango_layout.set_text(str_lien) cr.move_to(100, 100) cr.set_source_rgba(1, 0, 0, 1) pango_text.update_layout(pango_layout) pango_text.show_layout(pango_layout) # 需要更新 set_text的时候,主要是不覆盖原来的text. print pango_layout.get_line_count() return Truewindow = gtk.Window()window.set_size_request(300, 300) event_box = gtk.EventBox()event_box.add_events(gtk.gdk.ALL_EVENTS_MASK)event_box.connect("expose-event", draw_text_test)window.add(event_box)window.show_all()gtk.main()
Cairo本身不支持字体智能替换的,比如你如果设置字体为 wqy-microhei 并让其显示汉字,如果其他用户没有这种字体的话,cairo就自作主张的把它显示成“口口”。
能不能让cairo支持字体子能替换呢?当然可以啦,不然Gnome的应用程序怎么实现的?不过这得借助Pango!
Pango是GTK套件里用来处理国际化字体的,Pango与cairo有标准接口,可以实现用Pango来处理字体,而让Cairo显示。
这里,有两个封装了的函数,来实现cairo与pango的联合工作:
//draw a normal textvoid draw_text (cairo_t *cr, gchar *text, gchar *font){
PangoLayout *layout;
PangoFontDescription *desc;
layout = pango_cairo_create_layout (cr);
pango_layout_set_text (layout, text,-1);
desc = pango_font_description_from_string (font);
pango_layout_set_font_description (layout, desc);
pango_font_description_free (desc);
pango_cairo_update_layout (cr, layout);
pango_cairo_show_layout (cr, layout);
g_object_unref (layout);}//draw text which position should be middle in x .void draw_text_midx (cairo_t *cr, gchar *text, gchar *font, gint width_x, gint height_y){
PangoLayout *layout;
PangoFontDescription *desc;
int width, height;
layout = pango_cairo_create_layout (cr);
pango_layout_set_text (layout, text,-1);
desc = pango_font_description_from_string (font);
pango_layout_set_font_description (layout, desc);
pango_font_description_free (desc);
pango_cairo_update_layout (cr, layout);
pango_layout_get_size (layout,&width,&height);if(width_x-(double)width/PANGO_SCALE>0)
cairo_move_to (cr,(width_x -(double)width / PANGO_SCALE)/2, height_y);else
cairo_move_to (cr,0, height_y);
pango_cairo_show_layout (cr, layout);
g_object_unref (layout);}
代码:
# coding:utf-8
import pango
import pangocairo
import gtk
DEFAULT_FONT = "文泉驿微米黑"
DEFAULT_FONT_SIZE = 10
class TextView(gtk.EventBox):
def __init__(self):
gtk.EventBox.__init__(self)
self.im = gtk.IMMulticontext()
self.im.connect("commit", self.add_buffer_text)
self.set_visible_window(False) # for transparent background
self.set_can_focus(False)
self.buffer = ""
self.grab_focus()
self.add_events(gtk.gdk.ALL_EVENTS_MASK)
# self.connect("motion-notify-event", self.get_text_view_text)
self.connect("focus-out-event", self.get_text_view_focus)
self.connect("focus-in-event", self.set_text_view_focus)
self.connect("key-press-event", self.get_text_view_text)
self.connect("expose-event", self.text_view_draw_text)
def get_text_view_focus(self, widget, event):
self.im.focus_out()
self.queue_draw()
def set_text_view_focus(self, widget, event):
self.im.set_client_window(widget.window)
self.im.focus_in()
self.queue_draw()
def get_text_view_text(self, widget, event):
self.im.filter_keypress(event)
# print self.im.filter_keypress(event)
# key_name = get_keyevent_name(event)
keyval_name = gtk.gdk.keyval_name(event.keyval)
if "space" == keyval_name:
self.buffer += " "
else:
self.buffer += keyval_name
self.queue_draw()
def add_buffer_text(self, context, input_text):
self.buffer += input_text
self.queue_draw()
def text_view_draw_text(self, widget, event):
cr = widget.window.cairo_create()
rect = widget.allocation
# draw text font.
context = pangocairo.CairoContext(cr)
layout = context.create_layout()
layout.set_font_description(pango.FontDescription("%s %s" % (DEFAULT_FONT, DEFAULT_FONT_SIZE)))
layout.set_text(self.buffer)
print layout.get_pixel_size()
cr.move_to(10, 10)
cr.set_source_rgb(0, 0, 0)
context.update_layout(layout)
context.show_layout(layout)
return True
if __name__ == "__main__":
win = gtk.Window(gtk.WINDOW_TOPLEVEL)
sc_win = gtk.ScrolledWindow()
win.add(sc_win)
sc_win.add_with_viewport(TextView())
#TextView()
win.show_all()
gtk.main()
# coding:utf-8
import pango
import pangocairo
import gtk
DEFAULT_FONT = "文泉驿微米黑"
DEFAULT_FONT_SIZE = 10
class TextView(gtk.EventBox):
def __init__(self):
gtk.EventBox.__init__(self)
self.im = gtk.IMMulticontext()
self.im.connect("commit", self.add_buffer_text)
self.set_visible_window(False) # for transparent background
self.set_can_focus(False)
self.buffer = ""
self.grab_focus()
self.add_events(gtk.gdk.ALL_EVENTS_MASK)
# self.connect("motion-notify-event", self.get_text_view_text)
self.connect("focus-out-event", self.get_text_view_focus)
self.connect("focus-in-event", self.set_text_view_focus)
self.connect("key-press-event", self.get_text_view_text)
self.connect("expose-event", self.text_view_draw_text)
def get_text_view_focus(self, widget, event):
self.im.focus_out()
self.queue_draw()
def set_text_view_focus(self, widget, event):
self.im.set_client_window(widget.window)
self.im.focus_in()
self.queue_draw()
def get_text_view_text(self, widget, event):
self.im.filter_keypress(event)
# print self.im.filter_keypress(event)
# key_name = get_keyevent_name(event)
keyval_name = gtk.gdk.keyval_name(event.keyval)
if "space" == keyval_name:
self.buffer += " "
else:
self.buffer += keyval_name
self.queue_draw()
def add_buffer_text(self, context, input_text):
self.buffer += input_text
self.queue_draw()
def text_view_draw_text(self, widget, event):
cr = widget.window.cairo_create()
rect = widget.allocation
# draw text font.
context = pangocairo.CairoContext(cr)
layout = context.create_layout()
layout.set_font_description(pango.FontDescription("%s %s" % (DEFAULT_FONT, DEFAULT_FONT_SIZE)))
layout.set_text(self.buffer)
print layout.get_pixel_size()
cr.move_to(10, 10)
cr.set_source_rgb(0, 0, 0)
context.update_layout(layout)
context.show_layout(layout)
return True
if __name__ == "__main__":
win = gtk.Window(gtk.WINDOW_TOPLEVEL)
sc_win = gtk.ScrolledWindow()
win.add(sc_win)
sc_win.add_with_viewport(TextView())
#TextView()
win.show_all()
gtk.main()
如何去设置局部的颜色.... 比如(0 - 12) 之间.
gtk+ pango学习资料
最新推荐文章于 2023-10-09 11:33:52 发布