如何设置tkinter窗口的WM_CLASS字符串的应用程序名称?

时间:2017-06-28 06:59:59

标签: python ubuntu tkinter

简介

为了将桌面启动器中的一个图标下的给定应用程序的多个实例分组(我使用的是Ubuntu 17.04),它们必须具有WM_CLASS字符串的相同appName属性。例如,如果我运行emacs两次:

$ emacs &
$ emacs &

这两个实例都会显示在桌面启动栏的Emacs图标下。原因是两个实例都具有相同的WM_CLASS字符串。我们可以使用

检查这个字符串
$ xprop WM_CLASS

然后单击Emacs窗口。然后显示:

WM_CLASS(STRING) = "emacs", "Emacs"

这里" emacs"是资源(appName)," Emacs"是className, 有关详细信息,请参阅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属性?

另见

How to add launcher icon for python script?

1 个答案:

答案 0 :(得分:-1)

虽然第一个string确实添加了后缀,但如果您在配置中使用第二个string "Mytkapp",它将适用于正在运行的应用的所有版本。< / p>