2012-05-28 203 views
1

我希望窗口透明,但标签要100%不透明。我怎样才能做到这一点?顺便说一句:我注意到,当我升级到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() 

我发现askubuntu this的话题,这正是我一直在寻找的不过现在我在具有数字时钟显示的问题。任何帮助将不胜感激。

这是我的代码。

#!/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 

谷歌给你一个黑客使用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 

以上是“XP”透明效应:复制BG和bledit与您共赢。只有当它不是一个合成管理器运行。小部件可以使用 - 留在桌面上,但flickr的其他东西:在每个刷新窗口必须隐藏自己,捕捉gb,绘图和显示。 PS:我有一个工作时钟的例子,但我使用PNG。如果你愿意,我可以给你发一个tar.gz邮件

+0

感谢您的回复,是的,我会很感激tar.gz.很难理解答案,就像大多数人一样,我通过实验学得更好,因为我是一个视觉学习者。 顺便说一声:对不起,等待很久的回复。 –

+1

请分享StackOverflow上的代码,而不是通过电子邮件 - 其他人(包括我)也希望看到它。 StackOverflow不是私人通信的载体。 –