Skip to main content
 首页 » 编程设计

Python 困惑 : Set display

2025年05月04日13yyy_WW

如何在 Python-Clutter 中设置 X11 显示?我正在尝试将其设置为 XSCREENSAVER_WINDOW。我已尝试导入 clutter.x11 并使用 set_display(),但这似乎不是正确的命令。有谁知道这样做的正确方法吗?

请您参考如下方法:

在四处搜索时,我找到了 this thread , 并通过查看头像图片,我认为这是你的线程 ;) 我将重新发布 LemursDontExist 给出的代码所以您可以将所有功能合而为一。


简短说明:要使程序成为 X Windows 中的屏幕保护程序,程序会检查它是否作为屏幕保护程序运行,这意味着它是否被窗口系统本身调用。这是通过检查环境变量 DISPLAY 是否设置为 XSCREENSAVER_WINDOW 来完成的。

在这种情况下,程序需要全屏显示并对某些事件使用react。这正是下面的代码所做的。设置此变量是通过 xscreensaver 应用程序完成的,您不需要自己完成。

您缺少的是 clutter-gtk python 绑定(bind)。在当前的 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) 

有关如何将 clutter 与 python 一起使用的简短概述(它已发生很大变化),请参阅 this example