2012-05-28 6 views
1

Я хочу, чтобы окно было прозрачным, но метка была непрозрачной на 100%. Как я могу это достичь? BTW: Я заметил, что когда я обновился до интерфейса Ubuntu 12.04, интерфейс window.set_opacity не работал так, как в GNOME, но даже если бы все содержимое внутри окна стало прозрачным.PyGTK Прозрачное окно

Это код, который я начал с ...

#!/usr/bin/env python 

import pygtk 
pygtk.require('2.0') 
import gtk 
import pango 
import time 

class Clock: 

    def __init__(self): 
    me = gtk.Window(gtk.WINDOW_TOPLEVEL) 
    me.connect("destroy", lambda w: gtk.main_quit()) 
    me.set_decorated(False) 
    me.set_has_frame(False) 
    me.set_resizable(False) 
    me.set_property('skip-taskbar-hint', True) 
    self.label = gtk.Label() 
    self.label.modify_font(pango.FontDescription("FreeSerif Bold 50")) 
    attr = pango.AttrList() 
    fg_color = pango.AttrForeground(65535, 0, 0, 0, 65535) 
    attr.insert(fg_color) 
    self.label.set_attributes(attr) 

    me.add(self.label) 
    me.show_all() 

    def update(self): 
    self.label.set_text(time.strftime('%H:%M:%S')) 
    return True 

clock = Clock() 
gtk.timeout_add(200, clock.update) 
gtk.main() 

Я нашел this тему на askubuntu и это именно то, что я искал, однако сейчас у меня возникли проблемы, имеющие цифровые часы шоу. Любая помощь будет принята с благодарностью.

Вот мой код.

#!/usr/bin/env python 

import pygtk 
pygtk.require('2.0') 
import gtk 
import pango 
import time 
import cairo 

class Clock (gtk.Window): 
    def __init__(self): 
    super(Clock, self).__init__() 
    self.connect("destroy", lambda w: gtk.main_quit()) 
    self.set_decorated(False) 
    self.set_has_frame(False) 
    self.set_resizable(False) 
    self.set_property('skip-taskbar-hint', True) 
    self.label = gtk.Label() 
    self.label.modify_font(pango.FontDescription("FreeSerif Bold 50")) 
    attr = pango.AttrList() 
    fg_color = pango.AttrForeground(65535, 0, 0, 0, 65535) 
    attr.insert(fg_color) 
    self.label.set_attributes(attr) 

    self.screen = self.get_screen() 
    self.visual = self.screen.get_rgba_visual() 
    self.set_visual(self.visual) 
    self.set_app_paintable(True) 
    self.connect("draw", self.area_draw) 

    self.add(self.label) 
    self.show_all() 

    def update(self): 
    self.label.set_text(time.strftime('%H:%M:%S')) 
    return True 

    def area_draw(self, widget, cr): 
    cr.set_source_rgba(.2, .2, .2, 0.5) 
    cr.set_operator(cairo.OPERATOR_SOURCE) 
    cr.paint() 
    cr.set_operator(cairo.OPERATOR_OVER) 

clock = Clock() 
gtk.timeout_add(200, clock.update) 
gtk.main() 

ответ

3

Ну, вам нужно много взломать, чтобы сделать такой ярлык. Лучше всего изобретать велосипед: сделать круглый.

Нарисуйте свою собственную этикетку. Получить контекст окна (mywin.window.cairo_create())) и отслеживать x, y.

def draw(*args): 
    ctx = win.window.cairo_create() 
    ctx.set_source_rgba(0, 0, 0, 0) 
    ctx.set_operator(0) # OPERATOR_CLEAR 
    ctx.paint() 
    ctx.set_source_rgba(0, .6, 1, .3) 
    ctx.arc(w/2, h/2, w/2, 0, 2*3.1415) 
    ctx.fill() 
    ctx.set_source_rgba(1, .8, 0, 1) 
    ctx.show_text('29-May-1234') #you have some work for font, style and so on 

google дает вам взломать с использованием ctypes для загрузки шрифта ttf из файла; он отлично работает на Linux (я не знаю, как выиграть). ПРИМЕЧАНИЕ. Выше того, что у вас есть менеджер композитов, или ... rgba для виджета - None. также положить

colormap = self.win.get_screen().get_rgba_colormap() 
if colormap == None: colormap = self.win.get_screen().get_rgb_colormap() 
gtk.widget_set_default_colormap(colormap) 

установить RGBA, если Возможное, а также его стоит проверить:

if self.win.is_composited():print ('OK!') 
else:self.bg = self.capt_screen() 

........... 

def capt_screen(self): 
    x, y = self.win.get_position() 
    win = gtk.gdk.get_default_root_window() 
    w, h = win.get_size() 
    pb = gtk.gdk.Pixbuf(0 , False, 8, w, h) 
    self.win.hide() 
    pb = pb.get_from_drawable(win, win.get_colormap(), 0, 0, 0, 0, w, h) 
    self.win.show_all() 
    if (pb != None): 
     im = Image.fromstring('RGB', (w, h), pb.get_pixels()) 
     im = im.crop((x, y, x + self._w, y + self._h)) 
     im = im.convert('RGBA') 
     return im #or pb 

Выше «хр» прозрачный Эфект: скопировать BG и bledit с вашей победой. Только если это не менеджер композитного менеджера. Хорошо для виджета - оставайтесь на столе, но flickr для чего-то еще: в каждом окне обновления нужно спрятаться, захватить gb, рисовать и раскрывать.

PS: У меня есть рабочий пример часов, но я использую png. Если вам нравится, я могу отправить вам tar.gz по почте

+0

Спасибо за ответ, и да, я был бы благодарен tar.gz. Имея трудное понимание ответа, Как и большинство людей, я лучше разбираюсь в экспериментах, так как я визуальный ученик. BTW: Извините за долгожданный ответ. –

+1

Пожалуйста, разделите код на StackOverflow, а не по электронной почте - другие люди (включая меня) тоже захотят его увидеть. StackOverflow не является средством для частного общения. –

Смежные вопросы