gtk+ pango学习资料

来源:互联网 发布:pdf 密码移除 mac 编辑:程序博客网 时间:2024/05/20 05:08
               # 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) 之间.