Python杂乱:设置显示?

2 投票
1 回答
2693 浏览
提问于 2025-04-16 09:24

在Python-Clutter中,怎么设置X11显示呢?我想把它设置为XSCREENSAVER_WINDOW。我试过导入clutter.x11并使用set_display(),但这似乎不是正确的命令。有没有人知道正确的方法是什么?

1 个回答

0

在搜索的时候,我发现了这个帖子,根据头像来看,我猜这是你的帖子;)我会把LemursDontExist给出的代码重新发一遍,这样你就可以一次性看到所有内容了。


简单来说,要把一个程序变成X Windows下的屏幕保护程序,这个程序需要检查自己是否是以屏幕保护程序的身份运行,也就是说,它是否是被窗口系统以这种方式调用的。这个检查是通过查看环境变量DISPLAY是否设置为XSCREENSAVER_WINDOW来完成的。

如果是这样,程序就需要全屏显示并对某些事件做出反应。下面的代码正是实现这个功能的。设置这个变量是通过xscreensaver应用程序来完成的,你不需要自己去设置。

你缺少的部分是clutter-gtk的Python绑定。在当前的Ubuntu版本中,这个包的名称是gir1.2-clutter-gtk-0.10。有了这个,你就可以使用自定义窗口类和clutter API了。


class GsThemeWindow(gtk.Window):
    __gtype_name__ = 'GsThemeWindow'

def __init__(self):
    super(GsThemeWindow, self).__init__()
    self.connect("destroy", gtk.main_quit)

def do_realize(self):
    ident = os.environ.get('XSCREENSAVER_WINDOW')
    if not ident is None:
        self.window = gtk.gdk.window_foreign_new(int(ident, 16))
        self.window.set_events(gtk.gdk.EXPOSURE_MASK |
                               gtk.gdk.STRUCTURE_MASK)
        x, y, w, h, depth = self.window.get_geometry()
        self.size_allocate(gtk.gdk.Rectangle(x, y, w, h))
        self.set_default_size(w, h)
        self.set_decorated(False)
    else:
        self.window = gtk.gdk.Window(
            self.get_parent_window(),
            width=self.allocation.width,
            height=self.allocation.height,
            window_type=gtk.gdk.WINDOW_TOPLEVEL,
            wclass=gtk.gdk.INPUT_OUTPUT,
            event_mask=self.get_events() | gtk.gdk.EXPOSURE_MASK)
    self.window.set_user_data(self)
    self.style.attach(self.window)
    self.set_flags(self.flags() | gtk.REALIZED)

如果你想快速了解如何在Python中使用clutter(这方面变化很大),可以看看这个例子

撰写回答