2

ウィンドウを透明にしたいのですが、ラベルの不透明度を 100% にします。どうすればこれを達成できますか?ところで: Ubuntu 12.04 のユニティ インターフェイスにアップグレードしたときに、window.set_opacity が GNOME のように機能していないことに気付きましたが、たとえ機能したとしても、ウィンドウ内のすべてのコンテンツも透明になります。

これは私が始めたコードです...

#!/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 でこのトピックを見つけました。これはまさに私が探していたものですが、現在、デジタル時計を表示する際に問題が発生しています。どんな助けでも大歓迎です。

これが私のコードです。

#!/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()
4

1 に答える 1

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 は、ファイルから ttf フォントをロードするために ctypes を使用するハックを提供します。Linuxで非常にうまく機能します(winについてはわかりません)。注: 上記では、コンポジット マネージャーがある、または ... ウィジェットの 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 をコピーして、勝利でブライトします。コンポジット マネージャが実行されていない場合のみ。ウィジェットには問題ありません-机の上にとどまりますが、他のものにはflickrがあります。更新ウィンドウごとに、それ自体を非表示にし、gbをキャプチャし、描画して表示する必要があります。

PS: 動作する時計の例がありますが、png を使用しています。よろしければ、tar.gz をメールでお送りします。

于 2012-06-07T23:17:04.263 に答える