【Linux】Ubuntu 创建应用图标的方式汇总,deb/appimage/通用方法

news2025/6/9 17:21:01

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 python3

import sys
import os
from PyQt5.QtWidgets import (
    QApplication, QWidget, QLabel, QLineEdit, QPushButton,
    QFileDialog, QVBoxLayout, QHBoxLayout, QMessageBox, QCheckBox
)
from pathlib import Path

class 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() / name
            if path.exists():
                return path
        # fallback: 尝试 xdg-user-dir
        xdg_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, "错误", "请填写应用名称并选择启动脚本路径")
            return

        desktop_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.coloradmin.cn/o/2405628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LangGraph--Agent工作流

Agent的工作流 下面展示了如何创建一个“计划并执行”风格的代理。 这在很大程度上借鉴了 计划和解决 论文以及Baby-AGI项目。 核心思想是先制定一个多步骤计划,然后逐项执行。完成一项特定任务后,您可以重新审视计划并根据需要进行修改。 般的计算图如…

Spring Boot 常用注解面试题深度解析

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot 常用注解面试题深度解析一、核心…

Linux系统的CentOS7发行版安装MySQL80

文章目录 前言Linux命令行内的”应用商店”安装CentOS的安装软件的yum命令安装MySQL1. 配置yum仓库2. 使用yum安装MySQL3. 安装完成后,启动MySQL并配置开机自启动4. 检查MySQL的运行状态 MySQL的配置1. 获取MySQL的初始密码2. 登录MySQL数据库系统3. 修改root密码4.…

408第一季 - 数据结构 - 栈与队列

栈 闲聊 栈是一个线性表 栈的特点是后进先出 然后是一个公式 比如123要入栈,一共有5种排列组合的出栈 栈的数组实现 这里有两种情况,,一个是有下标为-1的,一个没有 代码不用看,真题不会考 栈的链式存储结构 L ->…

【RTP】Intra-Refresh模式下的 H.264 输出,RTP打包的方式和普通 H.264 流并没有本质区别

对于 Intra-Refresh 模式下的 H.264 输出,RTP 打包 的方式和普通 H.264 流并没有本质区别:你依然是在对一帧一帧的 NAL 单元进行 RTP 分包,只不过这些 NAL 单元内部有部分宏块是 “帧内编码” 而已。下面分步骤说明: 1. 原理回顾:RFC 6184 H.264 over RTP 按照 RFC 6184 …

Redis实战-消息队列篇

前言: 讲讲做消息队列遇到的问题。 今日所学: 异步优化消息队列基于stream实现异步下单 1. 异步优化 1.1 需求分析 1.1.1 现有下单流程: 1.查询优惠劵 2.判断是否是秒杀时间,库存是否充足 3.实现一人一单 在这个功能中&…

(三)Linux性能优化-CPU-CPU 使用率

CPU使用率 user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进…

佰力博科技与您探讨材料介电性能测试的影响因素

1、频率依赖性 材料的介电性能通常具有显著的频率依赖性。在低频下,偶极子的取向极化占主导,介电常数较高;而在高频下,偶极子的取向极化滞后,导致介电常数下降,同时介电损耗增加。例如,VHB4910…

K8S认证|CKS题库+答案| 4. RBAC - RoleBinding

目录 4. RBAC - RoleBinding 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、查看SA和role 3)、编辑 role-1 权限 4)、检查role 5)、创建 role和 rolebinding 6&#xff0…

React 新项目

使用git bash 创建一个新项目 建议一开始就创建TS项目 原因在Webpack中改配置麻烦 编译方法:ts compiler 另一种 bable 最好都配置 $ create-react-app cloundmusic --template typescript 早期react项目 yarn 居多 目前npm包管理居多 目前pnpm不通用 icon 在public文件夹中…

AI编程在BOSS项目的实践经验分享

前言 在人工智能技术革新浪潮的推动下,智能编程助手正以前所未有的速度重塑开发领域。这些基于AI的代码辅助工具通过智能提示生成、实时错误检测和自动化重构等功能,显著提升了软件工程的全流程效率。无论是初入行业的开发者还是资深程序员,…

数学:”度量空间”了解一下?

度量空间是现代数学中一种基本且重要的抽象空间。以下是对它的详细介绍: 定义 相关概念 常见的度量空间举例 度量空间的类型 度量空间的作用 度量空间是拓扑空间的一种特殊情况,它为拓扑空间的研究提供了具体的模型和实例。同时,度量空间在…

jenkins脚本查看及备份

位置与备份 要完整备份 Jenkins 的所有脚本和相关配置,包括 Jenkinsfile、构建脚本(如 .sh / .bat)、Job 配置、插件、凭据等,你可以从两个层面入手: ✅ 一、完整备份 Jenkins 主目录(最全面) …

用电脑通过网口控制keysight示波器

KEYSIGHT示波器HD304MSO性能 亮点: 体验 200 MHz 至 1 GHz 的带宽和 4 个模拟通道。与 12 位 ADC 相比,使用 14 位模数转换器 (ADC) 将垂直分辨率提高四倍。使用 10.1 英寸电容式触摸屏轻松查看和分析您的信号。捕获 50 μVRMS 本底噪声的较小信号。使用独有区域触摸在几秒…

《如何使用MinGW-w64编译OpenCV和opencv_contrib》

《如何使用MinGW-w64编译OpenCV和opencv_contrib》 在Windows环境下使用MinGW编译OpenCV和opencv_contrib是一个常见需求,尤其是对于那些希望使用GCC工具链而非Visual Studio的开发者。下面我将详细介绍这个过程。 准备工作 首先需要安装和准备以下工具和库: MinGW(建议使…

模拟搭建私网访问外网、外网访问服务器服务的实践操作

目录 实验环境 实践要求 一、准备工作 1、准备四台虚拟机,分别标号 2、 防火墙额外添加两块网卡,自定义网络连接模式 3、 关闭虚拟机的图形管理工具 4、关闭防火墙 5、分别配置四台虚拟机的IP地址,此处举一个例子(使用的临…

vue中Echarts的使用

文章目录 Echarts概述什么是EchartsEcharts的好处 Vue中Echarts的使用Echarts的安装Echarts的引入 Echarts概述 什么是Echarts Apache ECharts:一个基于 JavaScript 的开源可视化图表库。 其官网如下:https://echarts.apache.org/zh/index.html Echar…

【C++项目】负载均衡在线OJ系统-1

文章目录 前言项目结果演示技术栈:结构与总体思路compiler编译功能-common/util.hpp 拼接编译临时文件-common/log.hpp 开放式日志-common/util.hpp 获取时间戳方法-秒级-common/util.hpp 文件是否存在-compile_server/compiler.hpp 编译功能编写(重要&a…

Spring Boot微服务架构(十一):独立部署是否抛弃了架构优势?

Spring Boot 的独立部署(即打包为可执行 JAR/WAR 文件)本身并不会直接丧失架构优势,但其是否体现架构价值取决于具体应用场景和设计选择。以下是关键分析: 一、独立部署与架构优势的关系 内嵌容器的优势保留 Spring Boot 独立部署…

(四)Linux性能优化-CPU-软中断

软中断 中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力 由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快地运行 Linux 将中断处理过程分成了两个阶段&a…