gtk+ pango学习资料

               # 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) 之间.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值