系统托盘图标现在还是一个很神奇的功能。只须要右击图标,而后选择想要的动做,你就能够大幅简化你的生活而且减小平常行为中的大量无用的点击。python
一说到有用的系统托盘图标,咱们很容易就想到 Skype、Dropbox 和 VLC:linux
然而系统托盘图标实际上要更有用得多;你能够根据本身的需求建立本身的系统托盘图标。本指导将会教你经过简单的几个步骤来实现这一目的。git
咱们将要用 Python 来实现一个自定义的系统托盘指示器。Python 可能已经默安装在全部主流的 Linux 发行版中了,所以你只须要肯定一下它已经被安装好了(此处使用版本为 2.7)。另外,咱们还须要安装好 gir1.2-appindicator3
包。该库可以让咱们很容易就能建立系统图标指示器。github
在 Ubuntu/Mint/Debian 上安装:shell
sudo apt-get install gir1.2-appindicator3
复制代码
在 Fedora 上安装:bash
sudo dnf install libappindicator-gtk3
复制代码
对于其余发行版,只须要搜索包含 “appindicator” 的包就好了。app
在 GNOME Shell 3.26 开始,系统托盘图标被删除了。你须要安装 这个扩展(或者其余扩展)来为桌面启用该功能。不然你没法看到咱们建立的指示器。ide
下面是该指示器的基础代码:函数
#!/usr/bin/python
import os
from gi.repository import Gtk as gtk, AppIndicator3 as appindicator
def main():
indicator = appindicator.Indicator.new("customtray", "semi-starred-symbolic", appindicator.IndicatorCategory.APPLICATION_STATUS)
indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
indicator.set_menu(menu())
gtk.main()
def menu():
menu = gtk.Menu()
command_one = gtk.MenuItem('My Notes')
command_one.connect('activate', note)
menu.append(command_one)
exittray = gtk.MenuItem('Exit Tray')
exittray.connect('activate', quit)
menu.append(exittray)
menu.show_all()
return menu
def note(_):
os.system("gedit $HOME/Documents/notes.txt")
def quit(_):
gtk.main_quit()
if __name__ == "__main__":
main()
复制代码
咱们待会会解释一下代码是怎么工做的。可是如今,让咱们将该文本保存为 tray.py
,而后使用 Python 运行之:post
python tray.py
复制代码
咱们会看到指示器运行起来了,以下图所示:
如今,让咱们解释一下这个魔法的原理:
def main()
:此为指示器的主函数。该函数的代码用来初始化并建立指示器。indicator = appindicator.Indicator.new("customtray","semi-starred-symbolic",appindicator.IndicatorCategory.APPLICATION_STATUS)
:这里咱们指明建立一个名为 customtray
的新指示器。这是指示器的惟一名称,这样系统就不会与其余运行中的指示器搞混了。同时咱们使用名为 semi-starred-symbolic
的图标做为指示器的默认图标。你能够将之改为任何其余值;好比 firefox
(若是你但愿该指示器使用 FireFox 的图标),或任何其余你想用的图标名。最后与 APPLICATION_STATUS
相关的部分是指明指示器类别/范围的常规代码。indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
:这一行激活指示器。indicator.set_menu(menu())
:这里说的是咱们想使用 menu()
函数(咱们会在后面定义) 来为咱们的指示器建立菜单项。这很重要,可让你右击指示器后看到一个能够实施行为的列表。gtk.main()
:运行 GTK 主循环。menu()
中咱们定义了想要指示器提供的行为或项目。command_one = gtk.MenuItem('My Notes')
仅仅使用文本 “My notes” 来初始化第一个菜单项,接下来 command_one.connect('activate',note)
将菜单的 activate
信号与后面定义的 note()
函数相链接;换句话说,咱们告诉咱们的系统:“当该菜单项被点击,运行 note()
函数”。最后,menu.append(command_one)
将菜单项添加到列表中。exittray
相关的行是为了建立一个退出的菜单项,以便让你在想要的时候关闭指示器。menu.show_all()
以及 return menu
只是返回菜单项给指示器的常规代码。note(_)
下面是点击 “My Notes” 菜单项时须要执行的代码。这里只是 os.system("gedit $HOME/Documents/notes.txt")
这一句话;os.system
函数容许你在 Python 中运行 shell 命令,所以这里咱们写了一行命令来使用 gedit
打开家目录下 Documents
目录中名为 notes.txt
的文件。例如,这个能够称为你从此的平常笔记程序了!你只须要修改代码中的两块地方:
menu()
中为你想要的任务定义新的菜单项。因此,好比说你想要建立一个新菜单项,在点击后,会使用 VLC 播放硬盘中某个特定的视频/音频文件?要作到这一点,只须要在第 17 行处添加下面三行内容:
command_two = gtk.MenuItem('Play video/audio')
command_two.connect('activate', play)
menu.append(command_two)
复制代码
而后在第 30 行添加下面内容:
def play(_):
os.system("vlc /home/<username>/Videos/somevideo.mp4")
复制代码
将/home//Videos/somevideo.mp4` 替换成你想要播放的视频/音频文件路径。如今保存该文件而后再次运行该指示器:
python tray.py
复制代码
你将会看到:
并且当你点击新建立的菜单项时,VLC 会开始播放!
要建立其余项目/任务,只须要重复上面步骤便可。可是要当心,须要用其余命令来替换 command_two
,好比 command_three
,这样在变量之间才不会产生冲突。而后定义新函数,就像 play(_)
函数那样。
可能性是无穷的;好比我用这种方法来从网上获取数据(使用 urllib2 库)并显示出来。我也用它来在后台使用 mpg123
命令播放 mp3 文件,并且我还定义了另外一个菜单项来 killall mpg123
以随时中止播放音频。好比 Steam 上的 CS:GO 退出很费时间(窗口并不会自动关闭),所以,做为一个变通的方法,我只是最小化窗口而后点击某个自建的菜单项,它会执行 killall -9 csgo_linux64
命令。
你可使用这个指示器来作任何事情:升级系统包、运行其余脚本——字面上的任何事情。
咱们但愿系统托盘指示器能在系统启动后自动启动,而不用每次都手工运行。要作到这一点,只须要在自启动应用程序中添加下面命令便可(可是你须要将 tray.py
的路径替换成你本身的路径):
nohup python /home/<username>/tray.py &
复制代码
下次重启系统,指示器会在系统启动后自动开始工做了!
你如今知道了如何为你想要的任务建立本身的系统托盘指示器了。根据天天须要运行的任务的性质和数量,此方法能够节省大量时间。有些人偏心从命令行建立别名,可是这须要你每次都打开终端窗口或者须要有一个可用的下拉式终端仿真器,而这里,这个系统托盘指示器一直在工做,随时可用。
你之前用过这个方法来运行你的任务吗?很想听听你的想法。
via: fosspost.org/tutorials/c…
做者:M.Hanny Sabbagh 选题:lujun9972 译者:lujun9972 校对:wxy