如何真正把一个窗口放在所有其他的Linux PyGTK之上

2024-10-01 17:36:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试做一个窗口,将停留在lxpanel的顶部。在

我把窗户装上了,用

import gtk

myWindow = gtk.Window()

myWindow.set_keep_above(True)

myWindow.show_all()

这确实给了我一个窗口,它甚至可以滑动到LXpanel上。当点击其他窗口时,它甚至会停留在顶部,但是当我点击LXpanel本身时,LXpanel会跳到顶部,将我的窗口推到后面。我怎样才能让这扇窗户真正保持在最上面?在


Tags: importtruegtkshowallwindowabove窗户
3条回答

你可以这样做:

window = gtk.Window(gtk.WINDOW_POPUP)

这种行为是由窗口管理器控制的,您实际上对此无能为力。在

(在我的测试中,似乎Xfwm4和Fluxbox将keep over windows放在dock/panel窗口之上,尽管EWMH recommends,但您的WM可能没有。)

但是,有一个非常有限的解决方法:如果假设用户永远不会有多个dock/panel,那么可以将您的窗口设置为该dock窗口的transient。通常(同样,取决于窗口管理器)这会使窗口保持在停靠窗口上方。在


更新:在X11中,您可以设置临时窗口,即使它们不在同一进程中。我发现的最简单的方法是使用libwnck获取面板窗口的XID,然后使用gdk_window_foreign_new将其导入GDK。当然,这在非X系统中是行不通的。在

import wnck
screen = wnck.screen_get_default()
# BUG: There needs to be a small delay between the previous line and the next;
# otherwise get_windows returns an empty list.
windows = screen.get_windows()
panel = windows[1] # For example
panel_xid = panel.get_xid()

import gtk
window = gtk.Window()
window.show_all()
window.window.set_transient_for(gtk.gdk.window_foreign_new(panel_xid))

reference page中说{}只是对窗口管理器的一个请求,可能不会得到满足,所以我想说,在所有情况下都不可能实现这一点。在

总之,它还提供了一个有趣的信息:

You can track the above state via the gtk.Widget "window_state_event" signal.

也许您可以尝试为该信号设置回调,以确保尽快再次调用gtk.Window.set_keep_above。在

相关问题 更多 >

    热门问题