【Linux】Ubuntu 創建應用圖標的方式匯總,deb/appimage/通用方法

Ubuntu 創建應用圖標的方式匯總,deb/appimage/通用方法

對于標準的 Ubuntu(使用 GNOME 桌面),desktop 后綴的桌面圖標文件主要保存在以下三個路徑:

  1. 當前用戶的桌面目錄(這是最常見的位置)。所有放在這個目錄中的.desktop文件、文件夾或快捷方式會顯示在桌面上(如果桌面圖標功能啟用)。
~/Desktop # 英文系統
~/桌面 # 中文系統
  1. 用戶本地的應用程序快捷方式目錄。更改文件不需要 sudo 權限。
~/.local/share/applications
  1. 系統范圍的桌面圖標目錄。更改文件需要 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是否在終端中運行 (truefalse)
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。如果文件被刪除,圖標也會自動消失,完全不需要手動管理。

請添加圖片描述

三、通用方法

適用于一般的腳本、命令。

  1. 使用這個 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_())
  1. 安裝依賴
pip3 install PyQt5
  1. 運行腳本
cd desktop-creator && 
./desktop_creator.py
  1. 輸入應用名,啟動腳本路徑,應用圖標路徑還有選擇是否打開終端。兩個路徑可以直接輸入,也可以點擊右側按鈕進行選擇。

請添加圖片描述

輸入完成后,點擊創建桌面快捷方式,生成文件到 ~/Desktop。

請添加圖片描述

右鍵選擇 Allow Launching 之后可以雙擊運行應用

可以在終端中查看生成 desktop 文件的路徑和刪除方式。

同樣可以點擊創建應用快捷方式,生成文件到 ~/.local/share/applications。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908523.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【自然語言處理】大模型時代的數據標注(主動學習)

文章目錄 A 論文出處B 背景B.1 背景介紹B.2 問題提出B.3 創新點 C 模型結構D 實驗設計E 個人總結 A 論文出處 論文題目:FreeAL: Towards Human-Free Active Learning in the Era of Large Language Models發表情況:2023-EMNLP作者單位:浙江大…

【論文解讀】DeepSeek-R1

文章目錄 概覽一、DeepSeek-R1-Zero:在 Base Model 上直接進行 RL(一)強化學習算法(二)獎勵模型(三)數據構造(四)DeepSeek-R1-Zero 的性能、自我進化過程和 Aha Moment1.…

巴西醫療巨頭尤邁Kafka數據泄露事件的全過程分析與AI安防策略分析

一、事件背景與主體信息 涉事主體:Unimed,全球最大醫療合作社,巴西醫療行業龍頭企業,擁有約1500萬客戶。技術背景:泄露源于其未保護的Kafka實例(開源實時數據傳輸平臺),用于客戶與聊天機器人“Sara”及醫生的實時通信。二、時間線梳理 時間節點關鍵事件描述2025年3月24…

軟信天成:數據驅動型背后的人工智能,基于機器學習的數據管理

在數字化轉型浪潮中,當代企業如同逆水行舟,不進則退。無數企業希望通過數字化轉型捕獲全新的市場機遇,改善財政狀況,在未來市場競爭中占據一席之地。要想獲得成功的數字化轉型,關鍵因素在于具備可靠、及時的數據用以支…

如何理解 IP 數據報中的 TTL?

目錄 前言理解 前言 面試靈魂一問:說說對 IP 數據報中 TTL 的理解?我們都知道,IP 數據報由首部和數據兩部分組成,首部又分為兩部分:固定部分和可變部分,共占 20 字節,而即將討論的 TTL 就位于首…

【Java學習筆記】StringBuilder類(重點)

StringBuilder(重點) 1. 基本介紹 是一個可變的字符串序列。該類提供一個與 StringBuffer 兼容的 API,但不保證同步(StringBuilder 不是線程安全的) 該類被設計用作 StringBuffer 的一個簡易替換,用在字符…

計算機網絡 | 1.2 計算機網絡體系結構與參考模型

計算機網絡體系結構與參考模型 目錄 計算機網絡體系結構與參考模型 【思維導圖】 1、計算機的分層結構 1、為什么要分層? 2、什么是計算機網絡體系結構 2、計算機網絡協議、接口和服務 1)協議: 2)接口: 3…

微軟的新系統Windows12未來有哪些新特性

在今年即將到來的重大設計升級中,蘋果計劃對其全線操作系統統一按年份命名,作為另一巨頭微軟的win12還遠嗎?win11和win10是微軟現在正在用的主流版本,win11系統發布于2021年6月24日,win10系統發布于2015年7月29日。預計win12嘗鮮版可能在2025年下半年或明年。 盡管win12還…

制造業數智化卡在知識斷層?R2AIN SUITE AI知識管理打通關鍵經絡

在一家工廠里,工程師正面臨棘手難題——某機器異常振動的處理方案。他的筆記本記錄著三年前類似案例的解決方案,但翻查半小時仍未找到關鍵參數。與此同時,工廠的碳排放監控系統顯示,因設備停機導致的額外能源損耗已使產線碳強度有…

構造數列中的常見變形總結

前情概要 針對高考中構造數列的常見變形做一總結,便于梳理思路,提升思維。 類型Ⅰ: 形如 a n + 1 = p ? a n + q a_{n+1}=p\cdot a_n+q an+1?=p?an?+q, p , q p,q p,q為常數,即 a n + 1 = f ( a n ) a_{n+1}=f(a_n) an+1?=f(an?),構造變形方向: 其一: a n…

全國縣域統計年鑒PDF-Excel電子版-2022年

全國縣域統計年鑒PDF-Excel電子版-2022年.ziphttps://download.csdn.net/download/2401_84585615/89784662 https://download.csdn.net/download/2401_84585615/89784662 《中國縣域統計年鑒》是一部全面反映中國縣域社會經濟發展狀況的資料性年鑒。自2014年起,該年…

81 實戰一:給root目錄擴容

添加一塊100G硬盤 vgextend centos /dev/sdb1 /dev/sdc lvextend -L +120G /dev/centos/root xfs_growfs /dev/centos/root df -h 看是否擴容成功 82 實戰二:給swap空間擴容 添加一塊20G硬盤 fdisk -l 可以看到新添加的硬盤 vgextend centos /dev/sdd …

實現購物車微信小程序

實現一個微信小程序購物車頁面,包含以下功能: 需求說明: 商品列表:顯示商品名稱、價格、數量加減按鈕,支持修改商品數量(數量≥1)。 全選 / 反選功能:頂部 “全選” 復選框&#…

R語言使用隨機過采樣(Random Oversampling)平衡數據集

隨機過采樣(Random Oversampling)是一種用于平衡數據集的技術,常用于機器學習中處理類別不平衡問題。當某個類別的樣本數量遠少于其他類別時(例如二分類中的正負樣本比例懸殊),模型可能會偏向多數類&#x…

【力扣】2434.使用機器人打印字典序最小的字符串

1、題目描述: 2、測試用例: 3、解題思路 每次刪除字符串s的第一個字符,可以將s看做隊列,每次從頭部出。在t的尾端插入或刪除,可以將t看做棧棧頂元素出棧條件:①比即將入棧的元素小并且比s中剩下的還沒有入…

業務材料——半導體行業MES系統核心功能工業協議AI賦能

一、前置概念 半導體行業 半導體行業主要生產基于半導體材料(如硅、鍺、化合物半導體等)的電子元器件及相關產品,廣泛應用于計算、通信、能源、醫療等領域。 MES系統 MES系統(Manufacturing Execution System,制造…

視頻的分片上傳,斷點上傳

? 上傳功能的實現,點擊上傳按鈕,判斷添加的文件是否符合要求,如果符合把他放入文件列表中,并把他的狀態設置為等待中,對于每個文件,把他們切分為chunksize大小的文件片段,再檢查他的狀態是否為…

指針的定義與使用

1.指針的定義和使用 int point1(){//定義指針int a 10;//指針定義語法&#xff1a; 數據類型 * 指針變量名int * p;cout << "sizeof (int(*)) --> " << sizeof(p) << endl;//讓指針記錄變量a的地址 & 取址符p &a ;cout << &qu…

Git開發實戰

本文對開發中git的常用概念和操作做一個總結。參考綠毛鴨子的部分內容。 git分布式的體現 1.本地完整的版本庫&#xff1a; 每個克隆下來的 Git 倉庫都包含了項目的所有歷史記錄、提交、分支等信息。這意味著每個開發者的本地倉庫是一個完整的版本控制系統&#xff0c;包括…

ingress-nginx 開啟 Prometheus 監控 + Grafana 查看指標

環境已經部署了 ingress-nginx&#xff08;DaemonSet 方式&#xff09;&#xff0c;并且 Prometheus Grafana 也已經運行。但之前 /metrics 端點沒有暴露 Nginx 核心指標&#xff08;如 nginx_ingress_controller_requests_total&#xff09;&#xff0c;經過調整后現在可以正…