不知诸位有没有这样一个需求,当MacOS打开应用多的时候,Dock栏可能会很拥挤:
那么需求就产生了,能不能将某些软件的图标在Dock隐藏掉,同时也不影响日常使用呢?有的,接下来即将给出成熟的解决方案。
此篇文章的灵感来源于昨天的推文:微信钉钉消息监控处理机器人,因为其中有部分代码操作了应用的Info.plist
文件,所以便想到做这个小工具,本工具只支持MacOS。
开始
这个工具很简单,我会直接说明解决方案以及全部代码,同时也会说明一下如何编写一个第三方包并上传到pypi。
话说昨天需要提取应用包名的时候,研究了下每个应用下面的Info.plist
文件,不说其他的,发现其中的LSUIElement
可以控制软件的图标是否可以在Dock里面显示。
那么这就是上述问题的解决方案,只要修改LSUIElement
的值即可:
•如果需要隐藏图标:设置LSUIElement为1•如果需要显示图标:去掉LSUIElement即可
因此核心逻辑还是很简单的,接下来开始编码。
编码
再写一个项目之前,我们需要想清楚手上做的项目最终目的是什么?然后再想想怎么优雅得实现:
•目的:一个终端工具,可以实现对软件进行图标显示与隐藏•实现:用Python实现一个终端工具
好,第一步,建立项目:https://github.com/howie6879/leaf ,顺便附上说明:
A CLI tool for hiding the application’s icon in the Dock. (MacOS Dock栏软件图标隐藏终端工具)
构建项目目录结构:
├── LICENSE
├── Pipfile
├── README.md
├── leaf
│ ├── __init__.py
│ └── cli.py # 执行脚本
└── setup.py # 项目打包文件
1 directory, 6 files
一目了然,其中cli.py
核心代码如下:
def change_app_plist(app_name: str, status: bool = True):
"""
Used for hiding/displaying the application's icon
eg: leaf WeChat --status=1
:param app_name:
:param status:
:return:
"""
info_plist = PLIST_PATH_TEM.format(app_name)
if os.path.exists(info_plist):
with open(info_plist, "rb") as fp:
pl = plistlib.load(fp)
if status:
pl["LSUIElement"] = "1"
else:
pl.pop("LSUIElement", '')
with open(info_plist, "wb") as fp:
plistlib.dump(pl, fp)
print(f"{app_name} icon is {'hidden' if status else 'shows'} successfully, Please restart it.")
else:
output = f"Please make sure the app_name is correct, {app_name} is not in /Applications."
print("\033[1;31;40m" + output)
def execute():
fire.Fire(change_app_plist)
还是一目了然,写完可以Debug下,测试功能是否完善,这里介绍一下用法:
隐藏微信图标:
leaf WeChat
重启微信,看看效果:
图标果然隐藏了,哈哈~
如果想恢复,执行显示微信图标:
leaf WeChat --status=0
开源
测试结束后,目前还是只能自己使用。
这不行,不符合我们程序员的开源精神,上传到 https://pypi.org/ 吧(没注册的要先注册才能上传),第一步就是建立setup.py
:
from setuptools import find_packages, setup
setup(
name='leaf-cli',
version='0.0.1',
description="A CLI tool for hiding the application's icon in the Dock. (MacOS Dock栏软件图标隐藏终端工具)",
install_requires=['fire'],
author='Howie Hu',
author_email='xiaozizayang@gmail.com',
url="https://github.com/howie6879/leaf",
packages=find_packages(),
entry_points={
'console_scripts': [
'leaf = leaf.cli:execute'
]
},
)
上述起到一个项目注册的作用,比如申明项目名称等一系列基本信息、依赖包等。
setup.py
建立好之后,接下来就是上传了,我推荐使用 https://pypi.org/project/twine/ 包,简单易用:
# 打包
python setup.py sdist bdist_wheel
# 上传
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
上传成功后,就可以看到你的项目了,接下来就是等着被别人使用,如果你能收获到成就感,那么你就明白程序员的乐趣了。
比如本项目就会出现在 https://pypi.org/project/leaf-cli/
最后
最后自然是总结,本篇推文比较基础,主要讲的是通过实现一键隐藏/显示MacOS的应用图标,演示一个Python第三方包从零到一的过程。
如果你有什么需求,欢迎提出来,一起写好玩的工具,最后附上本项目的傻瓜使用教程:
安装
pip install leaf-cli
# New features
pip install git+https://github.com/howie6879/leaf
leaf-cli --help
隐藏
leaf WeChat
显示
leaf WeChat --status=0