【发布时间】:2017-12-01 09:54:40
【问题描述】:
简介
为了将给定应用程序的多个实例分组到桌面启动器中的一个图标下(我使用的是 Ubuntu 17.04),它们必须具有 WM_CLASS 字符串的相同 appName 属性。例如,如果我运行emacs 两次:
$ emacs &
$ emacs &
这两个实例都将显示在桌面启动栏中的 Emacs 图标下。原因是两个实例具有相同的 WM_CLASS 字符串。我们可以使用
来检查这个字符串$ xprop WM_CLASS
然后单击 Emacs 窗口。然后显示:
WM_CLASS(STRING) = "emacs", "Emacs"
这里“emacs”是资源(appName),“Emacs”是类名, 请参阅xdotool: what are “class” and “classname” for a window? 了解更多信息。
问题
考虑这个程序 (my-tkapp.py):
#! /usr/bin/env python
import tkinter as tk
root = tk.Tk(className='myTkApp')
label = tk.Label(root, text="Hello World")
label.pack()
root.mainloop()
如果我运行这个程序两次:
$ my-tkapp.py &
$ my-tkapp.py &
然后运行xprop 来检查两个窗口的WM_CLASS 属性,
第一个窗口给出:
WM_CLASS(STRING) = "myTkApp", "Mytkapp"
而第二个给出:
WM_CLASS(STRING) = "myTkApp #2", "Mytkapp"
请注意,tkinter 已在应用名称属性中添加了 #2 后缀。这是不希望的。它使窗口管理器将两个窗口分组在桌面启动栏中的单独图标下。
如何为我的应用程序的不同实例保留 WM_CLASS 字符串的相同 appName 属性?
另见
【问题讨论】:
-
您找到解决此问题的方法了吗?请分享!!!
-
@DimitrisDimitriadis 这就是我已经走了多远:bugs.python.org/issue30791。我还没有时间进入 Python 和 Tcl 源代码来追踪这个错误..