在 Linux 上为你的任务创建一个自定义的系统托盘指示器 | Linux 中国
2019-07-05 13:28
966 查看
你可以根据自己的需求创建自己的系统托盘图标。本指导将会教你通过简单的几个步骤来实现这一目的。-- M.hanny Sabbagh
系统托盘图标如今仍是一个很神奇的功能。只需要右击图标,然后选择想要的动作,你就可以大幅简化你的生活并且减少日常行为中的大量无用的点击。一说到有用的系统托盘图标,我们很容易就想到 Skype、Dropbox 和 VLC:然而系统托盘图标实际上要更有用得多;你可以根据自己的需求创建自己的系统托盘图标。本指导将会教你通过简单的几个步骤来实现这一目的。前置条件我们将要用 Python 来实现一个自定义的系统托盘指示器。Python 可能已经默安装在所有主流的 Linux 发行版中了,因此你只需要确定一下它已经被安装好了(此处使用版本为 2.7)。另外,我们还需要安装好
gir1.2-appindicator3包。该库能够让我们很容易就能创建系统图标指示器。在 Ubuntu/Mint/Debian 上安装:
sudo apt-get install gir1.2-appindicator3 apt-get install gir1.2-appindicator3在 Fedora 上安装:
sudo dnf install libappindicator-gtk3 dnf install libappindicator-gtk3对于其他发行版,只需要搜索包含 “appindicator” 的包就行了。在 GNOME Shell 3.26 开始,系统托盘图标被删除了。你需要安装 这个扩展(或者其他扩展)来为桌面启用该功能。否则你无法看到我们创建的指示器。基础代码下面是该指示器的基础代码:
#!/usr/bin/python!/usr/bin/python
import os os
from gi.repository import Gtk as gtk, AppIndicator3 as appindicator gi.repository import Gtk as gtk, AppIndicator3 as appindicator
def main(): main():
indicator = appindicator.Indicator.new("customtray", "semi-starred-symbolic", appindicator.IndicatorCategory.APPLICATION_STATUS)= appindicator.Indicator.new("customtray", "semi-starred-symbolic", appindicator.IndicatorCategory.APPLICATION_STATUS)
indicator.set_status(appindicator.IndicatorStatus.ACTIVE).set_status(appindicator.IndicatorStatus.ACTIVE)
indicator.set_menu(menu()).set_menu(menu())
gtk.main().main()
def menu(): menu():
menu = gtk.Menu()= gtk.Menu()
command_one = gtk.MenuItem('My Notes')= gtk.MenuItem('My Notes')
command_one.connect('activate', note).connect('activate', note)
menu.append(command_one).append(command_one)
exittray = gtk.MenuItem('Exit Tray')= gtk.MenuItem('Exit Tray')
exittray.connect('activate', quit).connect('activate', quit)
menu.append(exittray).append(exittray)
menu.show_all().show_all()
return menureturn menu
def note(_): note(_):
os.system("gedit $HOME/Documents/notes.txt").system("gedit $HOME/Documents/notes.txt")
def quit(_): quit(_):
gtk.main_quit().main_quit()
if __name__ == "__main__": __name__ == "__main__":
main()()我们待会会解释一下代码是怎么工作的。但是现在,让我们将该文本保存为
tray.py,然后使用 Python 运行之:
python tray.py.py我们会看到指示器运行起来了,如下图所示: Create a Custom System Tray Indicator For Your Tasks on Linux 13现在,让我们解释一下这个魔法的原理:◈ 前三行代码仅仅用来指明 Python 的路径并且导入需要的库。◈
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的文件。例如,这个可以称为你今后的日常笔记程序了!
添加你所需要的任务你只需要修改代码中的两块地方:
1. 在menu()中为你想要的任务定义新的菜单项。2. 创建一个新的函数让给该菜单项被点击时执行特定的行为。
所以,比如说你想要创建一个新菜单项,在点击后,会使用 VLC 播放硬盘中某个特定的视频/音频文件?要做到这一点,只需要在第 17 行处添加下面三行内容:
command_two = gtk.MenuItem('Play video/audio')= gtk.MenuItem('Play video/audio')
command_two.connect('activate', play).connect('activate', play)
menu.append(command_two).append(command_two)然后在第 30 行添加下面内容:
def play(_): play(_):
os.system("vlc /home/<username>/Videos/somevideo.mp4").system("vlc /home/<username>/Videos/somevideo.mp4")将/home//Videos/somevideo.mp4` 替换成你想要播放的视频/音频文件路径。现在保存该文件然后再次运行该指示器:
python tray.py.py你将会看到: Create a Custom System Tray Indicator For Your Tasks on Linux 15而且当你点击新创建的菜单项时,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 & python /home/<username>/tray.py &下次重启系统,指示器会在系统启动后自动开始工作了!结论你现在知道了如何为你想要的任务创建自己的系统托盘指示器了。根据每天需要运行的任务的性质和数量,此方法可以节省大量时间。有些人偏爱从命令行创建别名,但是这需要你每次都打开终端窗口或者需要有一个可用的下拉式终端仿真器,而这里,这个系统托盘指示器一直在工作,随时可用。你以前用过这个方法来运行你的任务吗?很想听听你的想法。
via: https://fosspost.org/tutorials/custom-system-tray-icon-indicator-linux作者:M.Hanny Sabbagh 选题:lujun9972 译者:lujun9972 校对:wxy本文由 LCTT 原创编译,Linux中国 荣誉推出
😻:还在看吗?相关文章推荐
- 在 Linux 上为你的任务创建一个自定义的系统托盘指示器
- Linux上为你的任务创建一个自定义的系统托盘指示器
- 修改initrd,创建一个微型的linux系统
- 修改initrd,创建一个微型的linux系统
- Linux系统:Ubuntu下如何在桌面创建一个应用程序的“快捷方式”?
- Vmware虚拟机完整创建一个linux(Ubuntu)系统全过程(四)
- 内容输出Linux文件系统的的实现:创建一个文件的过程
- MySQL创建一个固定频率执行且自定义"开始"时间的定时任务event
- BootISO:从 ISO 文件中创建一个可启动的 USB 设备 | Linux 中国
- 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)
- 《LINUX内核分析》第六周作业:Linux系统如何创建一个新进程
- 创建一个简易 APT 仓库 | Linux 中国
- Vmware虚拟机完整创建一个linux(Ubuntu)系统全过程(三)
- 为你的Flex应用程序创建一个自定义动画光标
- Linux系统下怎么用CheckInstall从源码创建一个RPM或DEB包
- 在VS里创建Windows窗体,让其最小化在系统托盘,并显示一个Icon图标
- Linux系统创建一个新的进程
- 手动创建一个小于10M的类嵌入式linux系统
- 为你的 Linux 应用创建 .desktop 文件 | Linux 中国
- 使用系统方法 创建一个 自定义样式的button