Ubuntu 創建應用圖標的方式匯總,deb/appimage/通用方法
對于標準的 Ubuntu(使用 GNOME 桌面),desktop 后綴的桌面圖標文件主要保存在以下三個路徑:
- 當前用戶的桌面目錄(這是最常見的位置)。所有放在這個目錄中的
.desktop
文件、文件夾或快捷方式會顯示在桌面上(如果桌面圖標功能啟用)。
~/Desktop # 英文系統
~/桌面 # 中文系統
- 用戶本地的應用程序快捷方式目錄。更改文件不需要 sudo 權限。
~/.local/share/applications
- 系統范圍的桌面圖標目錄。更改文件需要 sudo 權限。
/usr/share/applications
總結一下,如果想為普通用戶創建應用圖標,可以優先將 .desktop 文件放在前兩個路徑下,不需要 sudo 權限。另外路徑1是將圖標放在系統的桌面,也就是開機后看到的界面上,路徑2則是放在菜單中,點擊 All 展開后可以看見圖標。
.desktop
文件的基本格式如下:
[Desktop Entry]
Version=1.0
Type=Application
Name=My App
Comment=This is my application
Exec=/usr/bin/my-app
Icon=my-app-icon
Terminal=false
Categories=Utility;
字段 | 含義 |
---|---|
Type | 類型,如Application (應用程序)、Link (超鏈接)、Directory (目錄)等 |
Name | 應用程序顯示名稱 |
GenericName | 泛稱,如“文本編輯器” |
Comment | 簡短描述,鼠標懸停提示用 |
Exec | 啟動命令,可以包含參數(如%f ,%u ,見下方) |
Icon | 圖標文件名(可為絕對路徑或主題中的圖標名) |
Terminal | 是否在終端中運行 (true 或false ) |
Categories | 所屬菜單類別,如Utility ,Development ,Game 等 |
MimeType | 支持的 MIME 類型(用于與文件類型關聯) |
StartupNotify | 是否啟用啟動通知(通常為true ) |
Path | 啟動程序前切換到的工作目錄(可選) |
Hidden | 若為true ,則不會出現在菜單中 |
Exec 指定應用的路徑,通常是啟動可執行文件/ sh 腳本路徑/appimage路徑。當然也可以是某個終端命令,可以給自己常用的 shell 命令創建一個圖標。
接下來討論給 deb/appimage 快速創建圖標的方法,順便提供一個可以給一般的可執行文件/sh腳本/shell命令創建圖標的通用方法。
一、deb 應用
一般命令行安裝 deb 都會自動創建應用圖標。
命令 | 是否自動處理依賴 | 是否聯網下載依賴 |
---|---|---|
sudo dpkg -i xxx.deb | 否 | 否 |
sudo apt install ./xxx.deb | 是 | 是 |
如果沒有,則需要找到啟動文件,參考第三種方法創建圖標。
二、appimage 應用
一種方法是把 appimage 看成是可執行文件,手動編寫 desktop 文件。更加高效的方法是安裝 appimaged,自動維護特定目錄下所有 appimage 的桌面圖標。
appiamged 項目說明 https://github.com/probonopd/go-appimage/tree/master/src/appimaged#appimaged
安裝
# Remove pre-existing conflicting tools (if any)
systemctl --user stop appimaged.service || true
sudo apt-get -y purge appimagelauncher || true
[ -f ~/.config/systemd/user/default.target.wants/appimagelauncherd.service ] && rm ~/.config/systemd/user/default.target.wants/appimagelauncherd.service# Clear cache
rm "$HOME"/.local/share/applications/appimage*# Optionally, install Firejail (if you want sandboxing functionality)# Download
mkdir -p ~/Applications
wget -c https://github.com/$(wget -q https://github.com/probonopd/go-appimage/releases/expanded_assets/continuous -O - | grep "appimaged-.*-x86_64.AppImage" | head -n 1 | cut -d '"' -f 2) -P ~/Applications/
chmod +x ~/Applications/appimaged-*.AppImage# Launch
~/Applications/appimaged-*.AppImage
卸載方法
systemctl --user disable --now appimaged.service || true
rm ~/.config/systemd/user/appimaged.service
rm ~/.local/share/applications/appimagekit*.desktop
rm ~/Applications/appimaged-*-x86_64.AppImage
注意,安裝后不要刪除 ~/Applications/appimaged*.AppImage,之后會自動檢測以下路徑中的 appimage 應用,并自動創建圖標。
安裝后,以下路徑中的 appimage 應用都能被識別,自動創建圖表
- /usr/local/bin
- /opt
- ~/Applications(建議把所有 appimage 應用,如微信、QQ都放在這個路徑下進行統一管理)
- ~/.local/bin
- ~/Downloads
- $PATH, which frequently includes /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, and other locations
例如,將文件保存在 ~/Applications
圖標會自動出現,可以右鍵圖標進一步固定到 Dock。如果文件被刪除,圖標也會自動消失,完全不需要手動管理。
三、通用方法
適用于一般的腳本、命令。
- 使用這個 desktop_creator.py 腳本
#!/usr/bin/env python3import sys
import os
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QLineEdit, QPushButton,QFileDialog, QVBoxLayout, QHBoxLayout, QMessageBox, QCheckBox
)
from pathlib import Pathclass ShortcutCreator(QWidget):def __init__(self):super().__init__()self.setWindowTitle("快捷方式生成器")layout = QVBoxLayout()# 應用名輸入self.name_input = QLineEdit()self.name_input.setPlaceholderText("請輸入應用名稱")layout.addWidget(QLabel("應用名稱:"))layout.addWidget(self.name_input)# 腳本路徑輸入script_layout = QHBoxLayout()self.script_input = QLineEdit()self.script_input.setPlaceholderText("選擇啟動腳本路徑")script_button = QPushButton("選擇腳本")script_button.clicked.connect(self.select_script)script_layout.addWidget(self.script_input)script_layout.addWidget(script_button)layout.addLayout(script_layout)# 圖標路徑輸入icon_layout = QHBoxLayout()self.icon_input = QLineEdit()self.icon_input.setPlaceholderText("選擇圖標路徑")icon_button = QPushButton("選擇圖標")icon_button.clicked.connect(self.select_icon)icon_layout.addWidget(self.icon_input)icon_layout.addWidget(icon_button)layout.addLayout(icon_layout)# 終端復選框self.terminal_checkbox = QCheckBox("啟動時打開終端")self.terminal_checkbox.setChecked(True)layout.addWidget(self.terminal_checkbox)# 快捷方式按鈕button_layout = QHBoxLayout()desktop_btn = QPushButton("創建桌面快捷方式")global_btn = QPushButton("創建應用快捷方式")desktop_btn.clicked.connect(self.create_desktop_shortcut)global_btn.clicked.connect(self.create_user_launcher_shortcut)button_layout.addWidget(desktop_btn)button_layout.addWidget(global_btn)layout.addLayout(button_layout)self.setLayout(layout)def select_script(self):path, _ = QFileDialog.getOpenFileName(self, "選擇啟動腳本", "", "腳本文件 (*.py *.sh *.AppImage);;所有文件 (*)")if path:self.script_input.setText(path)def select_icon(self):path, _ = QFileDialog.getOpenFileName(self, "選擇圖標", "", "圖標文件 (*.png *.ico *.svg *.xpm);;所有文件 (*)")if path:self.icon_input.setText(path)def get_desktop_path(self):# 支持 Desktop 和 桌面possible_names = ["Desktop", "桌面"]for name in possible_names:path = Path.home() / nameif path.exists():return path# fallback: 嘗試 xdg-user-dirxdg_path = os.popen("xdg-user-dir DESKTOP").read().strip()return Path(xdg_path) if xdg_path else Path.home()def create_desktop_file(self, target_path):name = self.name_input.text().strip()script_path = self.script_input.text().strip()icon_path = self.icon_input.text().strip()open_terminal = self.terminal_checkbox.isChecked()if not (name and script_path):QMessageBox.warning(self, "錯誤", "請填寫應用名稱并選擇啟動腳本路徑")returndesktop_entry = f"""[Desktop Entry]
Name={name}
Exec={script_path}
Icon={icon_path if icon_path else 'utilities-terminal'}
Terminal={'true' if open_terminal else 'false'}
Type=Application
Categories=Utility;
"""try:with open(target_path, 'w') as f:f.write(desktop_entry)os.chmod(target_path, 0o755)QMessageBox.information(self, "成功", f"已創建快捷方式:{target_path}")print(f"? 快捷方式已生成: {target_path}")print(f"🗑? 若需刪除:運行命令:rm '{target_path}'")except Exception as e:QMessageBox.critical(self, "錯誤", f"創建失敗:{e}")def create_desktop_shortcut(self):desktop_path = self.get_desktop_path()target = desktop_path / f"{self.name_input.text().strip()}.desktop"self.create_desktop_file(str(target))def create_user_launcher_shortcut(self):app_path = Path.home() / ".local/share/applications"app_path.mkdir(parents=True, exist_ok=True)target = app_path / f"{self.name_input.text().strip()}.desktop"self.create_desktop_file(str(target))if __name__ == "__main__":app = QApplication(sys.argv)window = ShortcutCreator()window.show()sys.exit(app.exec_())
- 安裝依賴
pip3 install PyQt5
- 運行腳本
cd desktop-creator &&
./desktop_creator.py
- 輸入應用名,啟動腳本路徑,應用圖標路徑還有選擇是否打開終端。兩個路徑可以直接輸入,也可以點擊右側按鈕進行選擇。
輸入完成后,點擊創建桌面快捷方式,生成文件到 ~/Desktop。
右鍵選擇 Allow Launching 之后可以雙擊運行應用
可以在終端中查看生成 desktop 文件的路徑和刪除方式。
同樣可以點擊創建應用快捷方式,生成文件到 ~/.local/share/applications。