为什么我的自定义启动器文件在启动器栏上创建两个图标?

Min*_*ran 2 icons python unity launcher 16.04

我制作了一个 .desktop 文件,以便能够从启动栏启动我的 python 脚本。

我将 python 脚本设置为可执行文件,如果双击并从文件管理器运行它,它可以正常运行。它在终端上也运行良好。

桌面文件位于以下位置/.local/share/applications/,如下所示:

[Desktop Entry]
Version=1.0
Name=Simple Timer
Comment=Timer
Exec=python3 /home/user/app/timer.py
Icon=/home/user/app/icon/timer.png
Path=/home/user/app/timer/
Terminal=false
Type=Application
Categories=Utility;Application;
Run Code Online (Sandbox Code Playgroud)

如果我在 Dash 中搜索“Timer”,它就会出现。我可以从那里运行它。运行它会在启动栏上创建两个重复的图标,如图所示。

在此输入图像描述

  • 第一个图标将跳动约 10 秒,然后消失。该图标可锁定到启动器。如果该图标被锁定到启动栏,则应用程序窗口关闭后它也会跳动几秒钟,在此期间,它将无法单击。
  • 第二个图标无法锁定到启动器,并且仅在应用程序窗口关闭时才会消失。

如果我从文件管理器运行脚本。它创建 1 个运行正常的启动器图标。

我已验证 .desktop 文件中没有重复的 .desktop 文件/usr/share/applications/。我创建的 .desktop 文件仅存在于/.local/share/applications/,如果删除,我将无法再在 Dash 上搜索我的计时器或将其锁定到启动栏。

如何解决此处的脉动/无法点击问题和双图标问题?

Jac*_*ijm 5

启动器未将该窗口识别为“他的”

具体来说,Tkinter 窗口无法识别它们“自己的”窗口(类)。这使得图标徒劳地闪烁,等待它的窗口。一旦窗口出现,启动器就无法识别自己的窗口,并在超时后弹出启动器。由于“普通”窗口始终由启动器中的图标表示,因此您会留下一个通用图标(通常,如果没有重复的启动器)或另一个不同的图标(请参阅下文)。

您可以通过添加以下内容来简单地解决该问题:

StartupWMClass=Tk
Run Code Online (Sandbox Code Playgroud)

到您的启动器(因为它是 Tkinter 窗口)

看看区别(我给启动器提供了 firefox 图标进行测试):

  1. 打开多个窗口时无需使用该行。观察三个通用图标 + 一个闪烁的 Firefox 图标,大约 10 秒后消失。

    在此输入图像描述

  2. 现在我添加行StartupWMClass=Tk,所有窗口都分组在同一个图标中:

    在此输入图像描述

为什么你的情况下没有通用图标?

将 WM_CLASS 添加到您的 .desktop 文件将解决您的问题。不过,我很确定,您不小心创建了一个额外的启动器(或者 Unity 自动创建了一个启动器)。查看/.local/share/applications/并使您的启动器可执行。图标将显示。最有可能的是,你的骗子的名字里会有“团结”。

一般来说,如何找到一个窗口的WM_CLASS?

笔记

不是你的问题,而是:

您不需要设置以下行:

  • Version=1.0(没有坏处,但不需要)
  • 由于您的脚本是可执行的,因此您不需要python3(您可以让脚本直接调用解释器)
  • Path=/home/user/app/timer/(不必要)
  • Terminal=false(这是默认值)