如何使启动器进度条与我的应用程序配合工作?

背景研究

我正在尝试更新使用Quickly创建的一个简单的python/Gtk应用程序在Unity启动器中的进度条;然而,按照这个视频中的说明,我无法成功地更新Unity启动器中的进度条。 在Unity集成视频中,没有使用Quickly,所以应用程序的结构略有不同,并且视频中使用的代码在默认的Quickly ubuntu-application模板应用程序中似乎无法正常工作,需要进行修改。


截图

这是应用程序图标的屏幕截图,目前显示在Unity启动器中。

Blurry Application Icon Without a Visible Progress Bar

这是我想要的Unity启动器进度条功能的屏幕截图(覆盖在邮件图标上:wiki.ubuntu.com)。

Unity Launcher Progress Bar Functionality


项目代码

可以在这里找到包含项目文件的.zip文件。


预期行为

我希望上述代码在 Unity Launcher 中的测试应用程序图标上显示一个填充了 75% 的进度条,但是当执行命令quickly run时,该应用程序只会运行而不显示任何进度条。


问题调查

我认为问题在于我没有正确地获取到应用程序的主窗口的引用,然而,我不确定如何正确解决这个问题。我还相信这一行代码:self.launcher = Unity.LauncherEntry.get_for_desktop_id("test.destkop")可能是另一个复杂性的源头,因为Quickly创建的是.desktop.in文件而不是普通的.desktop文件,所以我不确定这是否也可能导致问题。

也许,问题的另一个来源是我并不完全理解.desktop.desktop.in文件之间的区别。是否有可能复制test.desktop.in文件并将其重命名为test.desktop,然后将其放置在/usr/share/applications目录中,以便get_for_desktop_id("test,desktop")可以引用到正确的.desktop文件?


相关研究链接

虽然我对.desktop和.desktop.in文件的区别还不太清楚,但我已经对.desktop文件进行了一些研究,并找到了几个链接:


编辑

在运行python setup.py build之后,然后导航到/build/share/applications并将构建的test.desktop文件移动到~/.local/share/applications,最后执行quickly run只显示一个问号作为图标,没有可见的进度条

Question mark for application icon displayed


编辑2

经过对构建的.desktop文件进行进一步调查,发现其中的一行:Icon=/usr/share/test/media/test.svg指向了一个名为test.svg的图标文件,但该文件并不存在。

为了解决这个问题,我使用命令sudo mkdir test/usr/share/下创建了一个名为test的新文件夹,然后再在test文件夹内部使用命令sudo mkdir media创建了另一个名为media的文件夹,接着将位于我的Quickly项目目录下test/data/media/test.svg位置的test.svg图标文件移动到了/usr/share/test/media/下。现在应用程序的.svg图标在Unity启动器栏和alt-tab视图中都能正确显示,但是如下截图所示,仍然没有可见的进度条

Only application icon displayed


编辑 3

正如 @dobey 所指出的那样,在 TestWindow.py 文件的这一行代码中有一个拼写错误:

self.launcher = Unity.LauncherEntry.get_for_desktop_id("test.destkop"),

其中 test.destkop 应该是 test.desktop

我更正了这个拼写错误,当使用 quickly run 执行应用程序时没有发生明显的变化。然而,在将 print('Integrating with launcher') 这行代码添加到 add_launcher_integration() 后,终端没有相应的输出,这表明问题似乎是在应用程序启动时未正确调用 add_launcher_integration()


编辑4

经过进一步调查,发现当应用程序启动时实际上会调用add_launcher_integration()。通过添加以下代码行:

os.system("clear")

在这行之前

print("Integrating with launcher")

现在终端中显示消息“与启动器集成”。然而,在Unity启动器栏中仍然没有进度条可见。

编辑5

通过执行python setup.py build重新构建Quickly项目,并将构建的.desktop文件从位于/build/share/applications/Quickly项目移动到~/.local/share/applications,应用程序图标和进度条现在在Unity启动器栏中正确显示。下面是启动器集成的屏幕截图。

Application icon and progress bar displayed

1个回答

.desktop文件必须安装在bamf库知道的位置。

您可以通过将构建好的.desktop文件(应从.desktop.in创建)复制到您的~/.local/share/applications文件夹中,并运行update-desktop-database ~/.local/share/applications来进行测试,尽管如果您的应用程序不处理任何MIME类型,则可能不需要运行此命令。

.desktop和.desktop.in之间的区别在于.desktop.in适用于翻译,并且在构建过程中由intltool进行处理,以插入翻译内容,从而从.desktop.in文件创建.desktop文件。

我刚注意到您代码中有个拼写错误:

self.launcher = Unity.LauncherEntry.get_for_desktop_id("test.destkop")

请注意 "destkop" 和 "desktop" 的区别,它应该是后者。如果这不是一个重新输入的错误,那么可能就是这个问题了。假设您的代码实际上正在运行,那么这就是一个问题。如果没有运行,那就是问题所在。您可以在 add_launcher_integration 函数中添加 print('Integrating with launcher') 来查看。当运行时,它应该会出现在终端上。

创建 .desktop 文件是在什么时候?它是在执行 "quickly run" 命令时创建的吗?它的位置在哪里? - Kevin Gurney
我不急着使用它,也不知道具体什么时候会构建它,但通常使用标准的Python库/应用程序,使用setup.py和DistUtilsExtra,当运行"./setup.py build"或setup.py命令时,它会自动构建。 - dobey
我成功地连续运行了python setup.py build。那么,现在我只需将test.desktop文件移动到~/.local/share/applications中,当我执行quickly run时,进度条应该会简单地显示出来。 - Kevin Gurney
我构建了Python项目,然后将构建的.desktop文件移动到~/usr/share/applications,接着像你建议的那样运行了update-desktop-database ~/.local/share/applications,但现在我只能看到一个问号作为应用程序图标,就像这里显示的一样:http://i.stack.imgur.com/RWYud.png。 - Kevin Gurney
test.desktop 文件中的 Icon= 行是什么意思? - dobey
Icon=/usr/share/test/media/test.svg - Kevin Gurney
好的,我在/usr/share目录下创建了一个名为test的文件夹,然后在test文件夹内又创建了一个名为media的文件夹,并将来自我的quickly项目中test/data/media/路径下的test.svg文件移动到了/usr/share/test/media/路径下。现在图标已经显示在启动器中了。然而,仍然没有像这里所示的进度条:http://i.stack.imgur.com/EPxGb.png。 - Kevin Gurney
你在问题中粘贴的代码是全部的代码吗?你正在运行GLib或Gtk的主循环吗? - dobey
我只是使用默认文件,这些文件是在执行快速创建Ubuntu应用程序测试命令时创建的。这包括几个Python文件,我没有编辑过。 - Kevin Gurney
我已经包含了位于测试文件夹中的所有"Quickly ubuntu-application"模板文件,以及上面的setup.py文件,以防它们在诊断问题时有用。 - Kevin Gurney
啊!谢谢你指出这个错别字!我改正了这个错误,但似乎没有任何变化。然而,我按照你的建议添加了print('Integrating with launcher'),但没有打印任何消息,这表明在运行应用程序时add_launcher_integration()似乎没有被正确执行。我该如何进一步诊断问题呢? - Kevin Gurney
我不确定。似乎可能没有调用finish_initializing函数。代码似乎应该使用.ui文件来加载GUI,但我没有看到任何地方加载代码。运行您的应用程序是否显示“TestWindow”窗口? - dobey
是的,当应用程序启动时会显示TestWindow,我认为加载.ui文件的工作可能由快速项目中test_lib文件夹中的代码处理。我没有在上面的test_lib文件夹中包含代码,因为我认为那可能是太多与问题无关的额外代码,但如果需要进一步调查问题,我可以包含上面的代码。 - Kevin Gurney
经过进一步调查发现,实际上确实调用了add_launcher_integration()函数,因为在print('Integrating with launcher')之前我调用了os.system("clear"),并且终端中显示了"Integrating with launcher"的消息。然而,仍然没有看到进度条。有任何关于为什么进度条仍未显示的想法吗? - Kevin Gurney
我已经在上面附上了一个包含所有项目文件的.zip文件。 - Kevin Gurney
现在你能把那些大块的代码删除掉吗?这个问题非常长。谢谢。 - dobey
是的,对此我感到很抱歉。 - Kevin Gurney
我通过运行python setup.py build重新构建了Quickly项目,并将构建好的.desktop文件移动到~/.local/share/applications/,现在图标和进度条都正常显示了!非常感谢你的帮助! - Kevin Gurney
嘿伙计们 - 如果你们需要进行交流,请把这个拆分到聊天室里。否则,请尽可能地更新你们的问题和答案,谢谢。 - fossfreedom