2010-06-12 2 views
1

는 여기 아이콘을 정의하기 위해 지금까지 가지고있는 코드 :Python과 GTK를 사용하여 사용자 정의 텍스트와 투명한 배경으로 상태 아이콘/시스템 트레이 아이콘을 만드는 방법은 무엇입니까?

icon_bg = gtk.gdk.pixbuf_new_from_file('gmail.png') 
w, h = icon_bg.get_width(), icon_bg.get_height() 
cmap = gtk.gdk.Colormap(gtk.gdk.visual_get_system(), False) 

drawable = gtk.gdk.Pixmap(None, w, h, 24) 
drawable.set_colormap = cmap 
gc = drawable.new_gc() 
drawable.draw_pixbuf(gc, icon_bg, 0, 0, 0, 0, w, h) 

drawn_icon = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, w, h) 
drawn_icon.get_from_drawable(drawable, cmap, 0, 0, 0, 0, w, h) 
icon = gtk.status_icon_new_from_pixbuf(drawn_icon) 

이는 아이콘으로 된 png를 얻기 위해 작동하지만,이 개 지역에서 부족하다. 첫째, 투명성이 작동하지 않습니다. 내가 투명 배경을 중심으로 이미지와 PNG로 22x22를 사용하는 경우,이 같은 내 안에 나타나 다른 활성 아이콘의 섹션으로 끝낼 :

http://i237.photobucket.com/albums/ff311/Raugturi/22x22_image_with_transparency.png

가 강탈 선택하는 아이콘이 다소이다 무작위. Dropbox 아이콘의 일부인 경우도 있고, NetworkManager 애플릿 인 경우도 있습니다. 내가 대신이 코드를 사용하는 경우

는 :

icon_bg = gtk.gdk.pixbuf_new_from_file('gmail.png') 
w, h = icon_bg.get_width(), icon_bg.get_height() 
cmap = gtk.gdk.Colormap(gtk.gdk.visual_get_system(), False) 

drawable = gtk.gdk.Pixmap(None, w, h, 24) 
drawable.set_colormap = cmap 
gc = drawable.new_gc() 
drawable.draw_pixbuf(gc, icon_bg, 0, 0, 0, 0, w, h) 

drawn_icon = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 22, 22) 
drawn_icon.get_from_drawable(drawable, cmap, 0, 0, 3, 6, w, h) 
icon = gtk.status_icon_new_from_pixbuf(drawn_icon) 

만 제거 투명 가장자리 16x11 인 이미지를, 제가 끝낼 것은 이것이다 :

http://i237.photobucket.com/albums/ff311/Raugturi/16x11_image_positioned_in_middle.png

어떻게 나는 다른 아이콘으로부터 물건을 끌어 들이지 않는 첫 번째 투명 블록으로 끝나야합니까?

두 번째 문제는 아이콘으로 변환하기 전에 이미지에 쓸 수있는 기능이 필요합니다. draw_glyphs를 사용해 보았는데 대신 Pango 레이아웃/컨텍스트를 사용해야한다고했습니다. 불행히도 내가 찾을 수있는 모든 Pango 자습서는 상태 아이콘이 아닌 실제 창을 처리합니다. Pango를 위해이 튜토리얼에 적용 할 좋은 튜토리얼이 있는가? (그리고 또한 내가 찾은 모든 폰트가 어떤 폰트로 쓰이는지 알려주는 방법에 대한 설명이 부족할 것이다. 그것없이 아무것도).

참고 : 실제 이미지가 부족하고 작동 링크가 하나 밖에 없기 때문에 유감스럽게도 저의 평판이 좋지 않아 스팸 방지 기능입니다.

답변

1

gtk.StatusIcon.set_from_file을 사용할 수없는 이유가 있습니까? 그것은 투명 이미지와 함께 잘 작동합니다.

두 번째 질문에 대해서는 gtk.StatusIcon에서 판고를 사용하는 것이 가능하다는 점을 매우 의심합니다.
왜 아이콘에 텍스트를 써야합니까?

+0

Google 서비스를 확인하고 읽지 않은 메시지 수를 상태 아이콘에 표시하는 애플리케이션을 작성 중이므로 한 눈에 얼마나 많은 메시지가 있는지 확인할 수 있습니다. 지금까지 내가 아는 한 두 가지 옵션 만 제공합니다 : 아이콘에 쓰거나 숫자의 이미지를로드하십시오. 나는 가능한 한 사용자가 폰트를 커스터마이징 할 수 있도록 작성하고 싶다. – Raugturi

+0

나는 해결책을 생각해 냈지만 오늘 밤까지는 시험 할 수 없을 것이라고 생각한다. 배경 이미지를로드하고, 쓸 수 있어야하고, 임시 파일에 저장 한 다음 그 위에 set_from_file을 사용할 수 있어야합니다. – Raugturi

+0

Raugturi, 결국 솔루션을 찾았습니까? 지금 당장 똑같은 것을 시도해. – halfdan

2

모든 언어 (perl, python, tcl, lua, c, C++, bash, ksh 등)와 함께 작동하려면이 도구를 작성해야합니다 (C에서는 있지만 별도의 프로세스로 설계되었습니다). 도구 설명 및 오른쪽 및 왼쪽 클릭 명령 (트레이의 크기에 따라 제한되는)이있는 아이콘이 여러 개 있습니다. 그런 다음 필요에 따라 아이콘을 변경하십시오. SVG를 통해 아이콘을 처리하는 가장 쉬운 방법은 다른 이미지 (png 포함)를 포함하고 미리 포맷 된 명령을 사용하여 텍스트 또는 복잡한 (또는 간단한) 모양을 신속하게 정의하기가 쉽기 때문입니다.

#include <sys/inotify.h> 
#include <gtk/gtk.h> 
#define EVENT_SIZE (sizeof (struct inotify_event)) 
#define EVENT_BUF_LEN  (1024 * (EVENT_SIZE + 16)) 
void leftclick(GtkStatusIcon *si, gpointer s){popen(s,"r");} /* exec s */ 
void rightclick(GtkStatusIcon *si, guint b,guint a_t, gpointer s){popen(s,"r");} 
void refresh(gpointer si, gint fd, GdkInputCondition c){ char buffer[EVENT_BUF_LEN]; 
    read(fd, buffer, EVENT_BUF_LEN); /* we are just clearing it & don't care what event type */ 
    gtk_status_icon_set_from_file(si,gtk_status_icon_get_title(si));} /* redraws */ 
int main(int argc, char *argv[]){ GtkStatusIcon *si; int i=1, watch, fd; 
gtk_init (&argc, &argv); /* loop through icon, tooltip, click messages */ 
while (i<argc) { fd = inotify_init(); /* get file descriptor to write on if image changes */ 
    si = gtk_status_icon_new_from_file(argv[i]); /* get a status icon widget */ 
    gtk_status_icon_set_title(si,argv[i]); /* hack to store the image path */ 
    watch = inotify_add_watch(fd, argv[i++], IN_CREATE | IN_MODIFY | IN_MOVED_FROM); 
    gdk_input_add(fd, GDK_INPUT_READ, refresh, si); /* inotify fd is ready for reading, refresh */ 
    gtk_status_icon_set_tooltip_text(si,argv[i++]); 
    g_signal_connect(G_OBJECT(si), "activate", G_CALLBACK(leftclick),(gpointer) argv[i++]); 
    g_signal_connect(G_OBJECT(si), "popup-menu", G_CALLBACK(rightclick), (gpointer) argv[i++]);} 
gtk_main();}