跳转至

自定义图标

我们在主教程中开发的应用在打包时使用了默认的 “灰色蜜蜂” 图标。让我们通过配置使用我们自己的图标来个性化此应用程序。

备注

在 BeeWare 中,icon 一词可以指两种不同的东西:

  • ** 应用程序图标** - 在桌面、Dock 或主屏幕上代表应用程序的图像。

  • 运行时图标 - 应用程序界面中使用的图片(例如,按钮或表格中的图片)。

添加图标

每个平台都使用不同的应用程序图标格式 – 有些还需要\ 多个\ 不同大小和形状的。为此考虑,Briefcase 提供了一种简短的方法,可以配置一次图标,并让这种定义扩充到每个单个平台的所有所需要的图标。

编辑您的 project.toml,在 [tool.briefcase.app.helloworld] 配置部分中,在 sources 的正上方添加一个 icon 配置项:

图标 = "icons/helloworld"

图标配置时,无需指定任何扩展文件名。这里的值将会被作为前缀使用;每个平台将会在此前缀基础上添加更多项目,以构建在那个平台上所需的文件。有些平台需要\ 多个\ 图标文件;在这种情况下,前缀将与文件大小和变种结合在一起,生成使用的图标列表。

我们现在可以重新运行 briefcase update — 但这次,我们传入 --update-resources 标志,以告诉 Briefcase 我们想要安装新的应用资源(图标):

(beeware-venv) $ briefcase update --update-resources

[helloworld] 更新应用程序代码...
正在安装 src/helloworld... 完成

[helloworld] 正在更新应用程序资源...
找不到应用程序图标的 icons/helloworld.icns;使用默认图标

[helloworld] 正在移除不需要的应用程序内容...
正在移除不需要的应用程序包内容... 完成

[helloworld] 应用程序已更新。
(beeware-venv) $ briefcase update --update-resources

[helloworld] 更新应用程序代码...
正在安装 src/helloworld... 完成

[helloworld] 更新应用程序资源...
找不到 16px 应用程序图标的 icons/helloworld-16.png;使用默认值
找不到 32px 应用程序图标的 icons/helloworld-32.png;使用默认值
找不到 64px 应用程序图标的 icons/helloworld-64.png;使用默认值
找不到 128px 应用程序图标的 icons/helloworld-128.png;使用默认值
找不到 256px 应用程序图标 icons/helloworld-256.png;使用默认图标
找不到 512px 应用程序图标 icons/helloworld-512.png;使用默认图标

[helloworld] 正在删除不需要的应用程序内容...
正在删除不需要的应用程序包内容... 完成

[helloworld] 应用程序已更新。
(beeware-venv) C:\...>briefcase update --update-resources

[helloworld] 更新应用程序代码...
正在安装 src/helloworld... 完成

[helloworld] 正在更新应用程序资源...
无法找到应用程序图标 icons/helloworld.ico;使用默认图标

[helloworld] 正在移除不需要的应用程序内容...
正在移除不需要的应用程序包内容... 完成

[helloworld] 应用程序已更新。
(beeware-venv) $ briefcase update android --update-resources

[helloworld] 正在更新应用程序代码...
正在安装 src/helloworld... 完成

[helloworld] 正在更新应用程序资源...
找不到 48px 圆形应用图标的 icons/helloworld-round-48.png;使用默认图标
找不到 72px 圆形应用图标的 icons/helloworld-round-72.png;使用默认值
找不到 96px 圆形应用图标的 icons/helloworld-round-96.png;使用默认值
找不到 144px 圆形应用图标的 icons/helloworld-round-144.png;使用默认值
找不到 192px 圆形应用图标的 icons/helloworld-round-192.png;使用默认图标
找不到 48px 方形应用图标的 icons/helloworld-square-48.png;使用默认图标
找不到 72px 方形应用图标的 icons/helloworld-square-72.png;使用默认图标
找不到 96px 方形应用图标 icons/helloworld-square-96.png;使用默认图标
找不到 144px 方形应用图标 icons/helloworld-square-144.png;使用默认图标
找不到 192px 方形应用图标 icons/helloworld-square-192.png;使用默认图标
无法找到 320px 正方形应用图标的 icons/helloworld-square-320.png;使用默认图标
无法找到 480px 正方形应用图标的 icons/helloworld-square-480.png;使用默认图标
无法找到 640px 正方形应用图标的 icons/helloworld-square-640.png;使用默认图标
找不到 960px 正方形应用图标 icons/helloworld-square-960.png;使用默认图标
找不到 1280px 正方形应用图标 icons/helloworld-square-1280.png;使用默认图标
找不到 108px 自适应应用图标 icons/helloworld-adaptive-108.png;使用默认图标
无法找到 162px 自适应应用图标的 icons/helloworld-adaptive-162.png;使用默认图标
无法找到 216px 自适应应用图标的 icons/helloworld-adaptive-216.png;使用默认图标
无法找到 324px 自适应应用图标的 icons/helloworld-adaptive-324.png;使用默认图标
无法找到 432px 自适应应用图标 icons/helloworld-adaptive-432.png;使用默认图标

[helloworld] 正在移除多余的应用内容...
正在移除多余的应用包内容... 完成

[helloworld] 应用已更新。
(beeware-venv) $ briefcase iOS --update-resources

  [helloworld] 正在更新应用程序代码...
  正在安装 src/helloworld... 完成

  [helloworld] 正在更新应用程序资源...
  找不到 20px 应用图标的 icons/helloworld-20.png;使用默认值
  找不到 29px 应用图标的 icons/helloworld-29.png;使用默认值
  找不到 40px 应用图标的 icons/helloworld-40.png;使用默认值
  找不到 58px 应用程序图标的 icons/helloworld-58.png;使用默认图标
  找不到 60px 应用程序图标的 icons/helloworld-60.png;使用默认图标
  找不到 76px 应用程序图标的 icons/helloworld-76.png;使用默认图标
  找不到 80px 应用程序图标的 icons/helloworld-80.png;使用默认图标
  找不到 87px 应用程序图标的 icons/helloworld-87.png;使用默认图标
  找不到 120px 应用程序图标的 icons/helloworld-120.png;使用默认图标
  找不到 152px 应用程序图标的 icons/helloworld-152.png;使用默认图标
  找不到 167px 应用程序图标的 icons/helloworld-167.png;使用默认图标
  找不到 180px 应用程序图标的 icons/helloworld-180.png;使用默认图标
  找不到 640px 应用程序图标的 icons/helloworld-640.png;使用默认图标
  找不到 1024px 应用程序图标的 icons/helloworld-1024.png;使用默认图标
  找不到 1280px 应用程序图标的 icons/helloworld-1280.png;使用默认图标
  无法找到 1920px 应用程序图标 icons/helloworld-1920.png;使用默认图标

  [helloworld] 正在删除不需要的应用程序内容...
  正在删除不需要的应用程序包内容... 完成

  [helloworld] 应用程序已更新。

这将报告 Briefcase 期望的特定图标文件(或多个文件)。但是,由于我们没有提供实际的图标文件,安装失败,Briefcase 恢复到默认值(相同的 "灰色蜜蜂 "图标)。

让我们提供一些实际的图标。下载 this icons.zip bundle,并解压到项目目录根目录。解压缩后,你的项目目录应该如下所示:

beeware-tutorial/
├── beeware-venv/
│   └── ...
└── helloworld/
    ├── ...
    ├── icons/
    │   ├── helloworld.icns
    │   ├── helloworld.ico
    │   ├── helloworld.png
    │   ├── helloworld-16.png
    │   └──...
    ├── src/
    │   └── ...
    └── pyproject.toml

这个文件夹中有很多图标,但大多数看起来都一样:浅蓝色背景上有一条绿色的蛇:

浅蓝色背景下的绿蛇图标](../../images/icon.png)。

唯一的例外是名称中带有"-adaptive-"的图标;这些图标将有透明背景。这代表了在 Briefcase 支持的每个平台上支持应用程序所需的所有不同图标尺寸和形状。

现在我们有了图标,可以再次更新应用程序了。不过,"briefcase update "只会将更新后的资源复制到构建目录中;我们还需要重建应用程序以确保包含新图标,然后启动应用程序。我们可以通过在调用 run 时传递 --update-resources来缩短这一过程,这将更新应用程序,更新应用程序的资源,然后启动应用程序:

(beeware-venv) $ briefcase run --update-resources

[helloworld] 更新应用程序代码...
安装 src/helloworld... 完成

[helloworld] 更新应用程序资源...
正在安装 icons/helloworld.icns 作为应用程序图标... 完成

[helloworld] 正在移除不需要的应用程序内容...
正在移除不需要的应用程序包内容... 完成

[helloworld] 应用程序已更新。

[helloworld] 正在对应用程序进行 Ad-hoc 签名...
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 00:01

[helloworld] 已构建 build/helloworld/macos/app/Hello World.app

[helloworld] 启动应用程序...
(beeware-venv) $ briefcase run --update-resources

[helloworld] 更新应用程序代码...
正在安装 src/helloworld... 完成

[helloworld] 更新应用程序资源...
正在将 icons/helloworld-16.png 安装为 16px 应用程序图标... 完成
正在安装 icons/helloworld-32.png 作为 32 像素的应用程序图标... 完成
正在安装 icons/helloworld-64.png 作为 64 像素的应用程序图标... 完成
正在安装 icons/helloworld-128.png 作为 128 像素的应用程序图标... 完成
正在将 icons/helloworld-256.png 安装为 256px 应用程序图标... 完成
正在将 icons/helloworld-512.png 安装为 512px 应用程序图标... 完成

[helloworld] 正在移除不需要的应用程序内容...
正在移除不需要的应用程序包内容... 完成

[helloworld] 应用程序已更新。

[helloworld] 构建应用程序……
构建引导二进制文件……
……

[helloworld] 已构建 build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld

[helloworld] 启动应用程序……
(beeware-venv) C:\...>briefcase build --update-resources

[helloworld] 更新应用程序代码...
安装 src/helloworld... 完成

[helloworld] 更新应用程序资源...
正在将 icons/helloworld.ico 安装为应用程序图标... 完成

[helloworld] 正在移除不需要的应用程序内容...
正在移除不需要的应用包内容... 完成

[helloworld] 应用程序已更新。

[helloworld] 正在构建应用...
正在从占位应用中移除所有数字签名... 完成
正在设置占位应用详细信息... 完成

[helloworld] 已构建 build\helloworld\windows\app\src\Hello World.exe

[helloworld] 正在启动应用...
(beeware-venv) $ briefcase build android --update-resources

[helloworld] 更新应用程序代码...
正在安装 src/helloworld... 完成

[helloworld] 更新应用程序资源...
正在将 icons/helloworld-round-48.png 安装为 48px 圆形应用程序图标... 完成
正在安装 icons/helloworld-round-72.png 作为 72px 圆形应用图标... 完成
正在安装 icons/helloworld-round-96.png 作为 96px 圆形应用图标... 完成
正在安装 icons/helloworld-round-144.png 作为 144px 圆形应用图标... 完成
正在安装 icons/helloworld-round-192.png 作为 192 像素圆形应用图标... 完成
正在安装 icons/helloworld-square-48.png 作为 48 像素方形应用图标... 完成
正在安装 icons/helloworld-square-72.png 作为 72 像素方形应用图标... 完成
正在安装 icons/helloworld-square-96.png 作为 96 像素的方形应用程序图标... 完成
正在安装 icons/helloworld-square-144.png 作为 144 像素的方形应用程序图标... 完成
正在安装 icons/helloworld-square-192.png 作为 192 像素的方形应用程序图标... 完成
正在安装 icons/helloworld-square-320.png 作为 320 像素的正方形应用程序图标... 完成
正在安装 icons/helloworld-square-480.png 作为 480 像素的正方形应用程序图标... 完成
正在安装 icons/helloworld-square-640.png 作为 640 像素的正方形应用程序图标... 完成
正在安装 icons/helloworld-square-960.png 作为 960 像素的正方形应用程序图标... 完成
正在安装 icons/helloworld-square-1280.png 作为 1280 像素的正方形应用程序图标... 完成
正在安装 icons/helloworld-adaptive-108.png 作为 108 像素的自适应应用程序图标... 完成
正在安装 icons/helloworld-adaptive-162.png 作为 162 像素自适应应用图标... 完成
正在安装 icons/helloworld-adaptive-216.png 作为 216 像素自适应应用图标... 完成
正在安装 icons/helloworld-adaptive-324.png 作为 324 像素自适应应用图标... 完成
正在安装 icons/helloworld-adaptive-432.png 作为 432 像素自适应应用图标……完成

[helloworld] 正在删除不需要的应用内容……
正在删除不需要的应用包内容……完成

[helloworld] 应用已更新。

[helloworld] 正在启动应用……

备注

如果您使用的是最新版本的安卓系统,您可能会注意到应用程序图标已更改为绿色的蛇形,但图标的背景却是白色,而不是浅蓝色。我们将在下一步中解决这个问题。

(beeware-venv) $ briefcase build iOS --update-resources

[helloworld] 更新应用程序代码...
安装 src/helloworld... 完成

[helloworld] 更新应用程序资源...
正在安装 icons/helloworld-20.png 作为 20px 应用程序图标... 完成
正在安装 icons/helloworld-29.png 作为 29px 应用程序图标... 完成
正在安装 icons/helloworld-40.png 作为 40px 应用程序图标... 完成
正在安装 icons/helloworld-58.png 作为 58px 应用程序图标... 完成
正在安装 icons/helloworld-60.png 作为 60px 应用程序图标... 完成
正在安装 icons/helloworld-76.png 作为 76px 应用程序图标... 完成
正在将 icons/helloworld-80.png 安装为 80px 应用程序图标... 完成
正在将 icons/helloworld-87.png 安装为 87px 应用程序图标... 完成
正在将 icons/helloworld-120.png 安装为 120px 应用程序图标... 完成
正在将 icons/helloworld-152.png 设置为 152px 应用程序图标... 完成
正在将 icons/helloworld-167.png 设置为 167px 应用程序图标... 完成
正在将 icons/helloworld-180.png 设置为 180px 应用程序图标... 完成
正在将 icons/helloworld-640.png 设置为 640 像素的应用程序图标... 完成
正在将 icons/helloworld-1024.png 设置为 1024 像素的应用程序图标... 完成
正在将 icons/helloworld-1280.png 设置为 1280 像素的应用程序图标... 完成
正在将 icons/helloworld-1920.png 设置为 1920 像素的应用程序图标……完成

[helloworld] 正在删除不需要的应用程序内容……
正在删除不需要的应用程序包内容……完成

[helloworld] 应用程序已更新。

[helloworld] 正在启动应用程序……

备注

如果在运行应用程序时出现引用 fakerhttpx 的堆栈跟踪,则有可能是在教程的第 7 或第 8 步中没有运行应用程序。重新运行应用程序,添加 -r 参数以更新应用程序需求。

在 iOS 或 Android 上运行应用程序时,除了图标的变化外,您还会发现闪屏也加入了新图标。不过,图标的淡蓝色背景与闪屏的白色背景显得有些格格不入。我们可以通过自定义闪屏的背景颜色来解决这个问题。将以下定义添加到 pyproject.toml 中,就在 icon` 定义之后:

splash_background_color = "#D3E6F5"

不幸的是,Briefcase 无法将此更改应用于已生成的项目,因为这需要修改在最初调用 briefcase create 时生成的文件之一。要应用这一更改,我们必须通过重新运行 briefcase create 来重新创建应用程序。当我们这样做时,系统会提示我们确认是否要覆盖现有项目:

(beeware-venv) $ briefcase create

应用程序“helloworld”已存在;是否覆盖 [y/N]? y

[helloworld] 正在删除旧的应用程序包...

[helloworld] 正在生成应用程序模板...
...

[helloworld] 已创建 build/helloworld/macos/app
(beeware-venv) $ briefcase create

应用程序“helloworld”已存在;是否覆盖 [y/N]? y

[helloworld] 正在删除旧的应用程序包...

[helloworld] 正在生成应用程序模板...
...

[helloworld] 已创建 build/helloworld/linux/ubuntu/jammy
(beeware-venv) C:\...>briefcase create

应用程序“helloworld”已存在;是否覆盖 [y/N]? y

[helloworld] 正在删除旧的应用程序包...

[helloworld] 正在生成应用程序模板...
...

[helloworld] 已创建 build\helloworld\windows\app
(beeware-venv) $ briefcase create android

应用程序“helloworld”已存在;是否覆盖 [y/N]? y

[helloworld] 正在删除旧的应用程序包...

[helloworld] 正在生成应用程序模板...
...
[helloworld] 已创建 build/helloworld/android/gradle
(beeware-venv) $ briefcase create iOS

应用程序“helloworld”已存在;是否覆盖 [y/N]? y

[helloworld] 正在删除旧的应用程序包...

[helloworld] 正在生成应用程序模板...
...
[helloworld] 已创建 build/helloworld/ios/xcode

然后,您可以使用 "briefcase run "重新构建和运行应用程序。您不会注意到桌面应用程序有任何变化;但安卓或 iOS 应用程序现在应该有一个淡蓝色的闪屏背景。

每当您对 pyproject.toml进行与源代码或依赖关系无关的更改时,都需要像这样重新创建应用程序。对描述、版本号、颜色或权限的任何更改都需要重新创建步骤。因此,在开发项目时,不应手动更改 build 文件夹的内容,也不应将 build 文件夹添加到版本控制系统中。build "文件夹应被视为完全短暂的,它是构建系统的输出,可根据需要重新创建,以反映项目的当前配置。

添加运行时图标

在应用程序界面上添加图标时,这类图标必须与应用程序图标分开存放。右键单击牦牛提比略,将图片保存为.png文件并命名为helloworld。然后将该文件保存到应用程序源码包中的 icons/ 文件夹中。

牦牛提比略的圣像](../../images/runtime-icon.png)。

您的目录将如下所示:

beeware-tutorial/
├── beeware-venv/
│   └── ...
└── helloworld/
    ├── ...
    ├── icons/
    │   ├── helloworld.icns
    │   ├── helloworld.ico
    │   ├── helloworld.png
    │   ├── helloworld-16.png
    │   └──...
    ├── src/
    │   ├── helloworld
    │   │   └── icons/
    │   │ └── helloworld.png
    │   └──...
    └── pyproject.toml

现在运行时图标已经就位,让我们为按钮添加一个图标。Toga 按钮 widget 只能容纳图标或文本(不能同时容纳),因此让我们更新按钮的代码,加入运行时图标。

helloworld_icon = toga.Icon("icons/helloworld")

button = toga.Button(
    icon=helloworld_icon,
    on_press=self.say_hello,
    margin=5,
)

由于运行时图标是捆绑在 Python 包内的应用程序资源,因此不需要重建或更新资源。此时,您可以运行 briefcase dev (或 briefcase run) 来查看添加到按钮上的图标。