自定义图标和应用程序名称未填充 Dock 或顶部菜单

自定义图标和应用程序名称未填充 Dock 或顶部菜单

我最近从 16.04 升级到了 Ubuntu 18.04。现在,我自己的一个应用程序在 ~/.local/share/applications 中有一个 .desktop 文件,但它没有用图标填充 Dock — 而是出现了一个通用的“某些内容被禁止”图标 — 并且当鼠标悬停在图标上时显示为“未知”。 (在 16.04 中,这个相同的应用程序在运行时用其自定义图标填充 Dock,当鼠标悬停在其 Dock 图标上时显示其正确的名称。)此外,“未知”显示在顶部菜单栏中“活动”旁边的菜单中。另一方面,自定义图标出现在 Nautilus 中,与 .desktop 文件正确关联。

所有这些内容都可以在链接的屏幕截图中看到:该应用程序名为 Lexitron,其自己的窗口位于最前面,其 .desktop 文件(带有其自定义图标)显示在 Nautilus 中,您可以在 Dock 中看到通用的“禁止”图标,其中“未知”显示为应用程序的名称,同时在顶部菜单栏的“活动”旁边。(我的自定义图标也正确显示在“显示应用程序”屏幕中,但我无法截取屏幕截图。)

屏幕截图,Dock 中没有自定义图标,但 Nautilus 中有此图标

以下是 lexitron.desktop 文件本身的复制和粘贴内容:

[Desktop Entry]
Version=0.9
Name=Lexitron
Exec=/home/jason/dev/src/python3/lexicon/lexitron.py --interface graphic
Icon=/home/jason/dev/src/python3/lexicon/lexitron.png
Terminal=false
Type=Application
Categories=Application

将我的自定义图标固定在 Dock 中(在“显示应用程序”屏幕中右键单击我的应用程序图标并选择“添加到收藏夹”),将鼠标悬停在该图标上会显示该应用程序的正确名称。但这也不能解决问题:单击固定的自定义图标仍会显示带有“未知”标签的禁止图标,并且图标显示为正在运行,旁边有一个红点。(并且“未知”仍然作为应用程序出现在顶部菜单栏中。)所有这些都显示在以下链接的屏幕截图中:

屏幕截图,其中 Dock 中自定义图标不起作用,由通用图标复制

请注意:

  • 我尝试使用 JPG 文件代替 PNG 文件,但行为没有变化
  • .desktop 文件中的图标规范末尾没有空格或隐藏字符(并且,无论如何,该图标由 Nautilus 和“显示应用程序”显示使用)
  • 我曾尝试按照下面最后两篇帖子的建议在 .desktop 文件中指定 StartupWMClass,但当我在终端中输入“xprop WM_CLASS”并单击我的应用程序窗口时,响应为“WM_CLASS:未找到”。我尝试使用“StartupWMClass=Lexitron”(即应用程序自己的名称),但没有效果。该应用程序是一个 Python3/PyQt5 程序。
  • 我通过双击 .desktop-file 图标来启动应用程序,无论是在其原始位置还是将其移动到桌面和其他地方。我第一次在每个位置执行此操作时都会弹出“不受信任的启动器应用程序”对话框,我选择“信任并启动”。这与上面描述的行为没有区别:Dock 中仍然有一个通用图标,应用程序在 Dock 和顶部菜单中仍然被称为“未知”。

我在 Ask Ubuntu 的以下帖子中研究了这个问题(其中大多数都相当旧,而且有些似乎不太相关):

但是,我按照其中的所有建议去做,问题还是没有解决。而且,据我所知,它们都没有解决我提出的“未知”应用程序名称问题。

更新:

我得出的初步结论是,问题与我的 .desktop 文件无关。我已尝试了 @Sayen 在下面的评论中建议的所有方法,并且还运行了desktop-file-validate我的 .desktop 文件,结果发现它没有任何问题。

我甚至还采取了更为激进的方式,暂时篡改了现有的、功能齐全的 .desktop 文件,在本例中,该文件是 Shotwell 的,位于 /usr/share/applications/shotwell.desktop。创建备份后,我更改了 shotwell.desktop 中的 Exec 行(仅限)以指向我的应用程序。使用该编辑的 .desktop 文件,无论是直接双击它还是单击“显示应用程序”图标产生的显示中的 Shotwell 图标,我的应用程序都可以正常运行,但启动器会显示带有“未知”名称的通用禁止图标,如上文所述和所示。

因此,在我看来,我的 Python3/PyQt5 应用程序本身存在一些与启动器背后的机制不一致的问题。我将进一步调查,如果有任何内容需要报告,我将更新此帖子。

答案1

我遇到了类似的问题,我通过制作自己的 .desktop 文件解决了这个问题。您可以按照这些命令制作自己的文件。例如,我为 Postman 应用程序制作了它

sudo apt-get install --no-install-recommends gnome-panel

gnome-desktop-item-edit ~/Desktop/ --create-new

cp Postman.desktop ~/.local/share/applications

答案2

我解决了我的问题,至少对于我自己的设置来说是这样,如上所述。解决方案与 .desktop 文件等无关。我能够将我的应用程序的实际名称(而不是“未知”)添加到菜单栏和停靠栏(当将鼠标悬停在后者的图标上时),只需将其作为列表中的第一个项目作为唯一的参数传递给QApplication:实际上,模拟基于 C 或 C++ CLI 的程序中的内容argv[0],即调用程序的名称。我能够通过显式调用应用程序来显示我的图标(注意:不是主窗口的setWindowIcon方法。所以我现在成功的设置顺序是:

# QApplication must be called before any GUI elements are built
application = QApplication([ENV.DISPLAY_NAME])
# set application icon (works for Ubuntu and Mac)
application.setWindowIcon(QIcon(APP_ICON))
# The following assignment is necessary to create a ref to MainWindow,
# otherwise MainWindow immediately gets garbage-collected!
mainWindow = MainWindow(ID.NAME, options)
# In Python3, we don't need exec_ since exec is not a reserved word
application.exec()

相关内容