我想做以下事情:创建一个全屏,始终在顶部pygtk窗口,其中webkit小部件显示一些html,但是有一个完全透明的框,以便下面的窗口可见.(这似乎是可能的:是否可以使用WebKit在清晰的背景上呈现Web内容?)
我想要的是(有时)将透明框中出现的所有鼠标事件传递到应用程序窗口下方的窗口,以便我可以正常地与它们进行交互.因此,不仅视觉上透明,而且对鼠标事件也是透明的.
从理论上讲,我想我可以通过pygtk Eventbox捕获我感兴趣的所有事件,使用wnck在我的正下方找到窗口,并使用python-xlib将此事件传递给它.
这似乎不是最优雅的解决方案; 有没有更好的办法?
这对我来说很奇怪。有人可以解释为什么 activate() 函数需要时间戳吗?99.9% 的时间不是现在或尽快或“在您方便的时候”吗?此外,如果你尝试 w.activate(0) 你会收到这个警告:
Wnck-WARNING: Received a timestamp of 0; window activation may not function properly
Run Code Online (Sandbox Code Playgroud)
我读过的有关此警告的每个论坛帖子都没有答案。但它们似乎都表明代码无法正常工作,除非您实际输入时间戳。如果你输入 (0),事情就不起作用了,你会收到警告。但是,对我来说,如果我输入时间戳,那就是事情不起作用的时候。如果我使用 (0),则程序可以正常工作,但会收到警告(仅当我在终端窗口中运行它时)。
到底为什么 activate() 关心“时间”?
只有我觉得这很疯狂吗?
我用Wnck来检查是否已经创建了一个窗口:
screen = Wnck.Screen.get_default()
screen.force_update() # recommended per Wnck documentation
window_list = screen.get_windows()
for window in window_list:
print(window.get_name())
if window.has_name():
if window.get_name() == self.xld_main_window.get_title():
window_found = True
break
assert window_found, 'The Gtk.Window named {window_name} has not been found.'\
.format(window_name=self.xld_main_window.get_title())
# clean up Wnck (saves resources, check documentation)
window = None
screen = None
Run Code Online (Sandbox Code Playgroud)
但是,由于对话框没有显示在任务列表中,我无法找到它们.检查它们是否显示(以及模态/非模态)的适当方法是什么?
我正在尝试将多个 Chrome 独立窗口分组到 Ubuntu 14.04 中的同一启动器下。似乎不可能简单地WM_CLASS在 .desktop 文件中指定多个变量(请参阅对此答案的评论)。
我想到的第一个解决方案是在短暂的延迟后使用 xprop 将额外窗口的 WM_CLASS 更改为与所选主窗口相同。如果我没有在命令行指定要更改的窗口,让它给我一个十字准线,然后使用如下命令单击任性的窗口,则此方法有效:
xprop -f WM_CLASS 8s -set WM_CLASS crx_kphgejagakmceapfinpoopapfdnkkepf
Run Code Online (Sandbox Code Playgroud)
(在对同一问题的回答中没有太多理解)
它获得新的WM_CLASS,Ubuntu 立即将其重新组合到所选的启动器而不是 Chrome 下。
然而,尽管所有外观的窗口都具有非常简单的名称Todoist(这是标题栏上显示的名称,并xprop | grep -i name给出
WM_NAME(UTF8_STRING) = "Todoist"
_NET_WM_NAME(UTF8_STRING) = "Todoist"
WM_LOCALE_NAME(STRING) = "en_US.UTF-8"
Run Code Online (Sandbox Code Playgroud)
所以,我认为 xprop 不可信。
相反,我发现我可以使用 python 包 wnck 来访问这个窗口,方式如下:
import wnck
todoist = [w for w in wnck.screen.get_defaults().get_windows()
if 'todoist' in w.get_name().lower()][0]
Run Code Online (Sandbox Code Playgroud)
那么,我如何使用这个对象todoist来改变底层WM_CLASS呢?
我意识到这完全是一个 xy 问题,因此我对完全不同的方法持开放态度。
我刚开始使用 PyGI(在 Ubuntu Natty 上),尽管我以前从未使用过 pygtk。不过,我在 wxPython 程序中使用过 wnck,获取当前打开的窗口列表很容易。在 PyGI 中,窗口列表始终为空。相关代码位:
from gi.repository import Gtk, Wnck
while Gtk.events_pending():
Gtk.main_iteration()
#... in my app class...
screen = Wnck.Screen.get_default()
wins = screen.get_windows()
Run Code Online (Sandbox Code Playgroud)
与此,wins == []。谢谢!
我现在有一个项目,正在使用WNCK查找打开的窗口的位置并对其进行聚焦。我最近添加了需要Python 3.5的功能,但WNCK仅在Python 2.7或我安装的任何版本上均可使用。当运行python3 stuff.py时,我得到
ImportError:没有名为“ wnck”的模块
有谁知道我如何获得适用于Python 3的wnck库?我以前用sudo apt-get install python-wnck为python2买了它
我正在使用Ubuntu,因此如果答案是“无法正常运行WNCK,请切换到X”,请确保它不是Windows专用的解决方案