跳轉到

自訂圖示

到目前為止,我們的應用程式使用了預設的 灰色蜜蜂 圖示。我們如何更新應用程式以使用我們自己的圖標?

注意事項

在 BeeWare 中,icon 一詞可以指兩種不同的東西:

  • ** 應用程式圖示** - 在桌面、Dock 或主畫面上代表您的應用程式的圖像。

  • 運行時圖示 - 應用程式介面中使用的圖片 (例如,按鈕或表格)。

新增圖示

每個平台都使用不同的應用程式圖示格式,有些平台需要不同大小和形狀的多個圖示。為了解決這個問題,Briefcase 提供了一種速記的方式來一次設定圖示,然後將該定義展開為每個平台所需的所有不同圖示。

編輯您的「pyproject.toml」,在「[tool.briefcase.app.helloworld]」配置區段中加入新的「icon」配置項目,就在「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

這個資料夾裡有很多圖示,但大多數看起來都一樣:淺藍色背景上有一條綠色的蛇:

淺藍色背景的綠蛇圖示

唯一的例外是名稱中含有 -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 作為 32px 應用程式圖示... 完成
正在安裝 icons/helloworld-64.png 作為 64px 應用程式圖示... 完成
正在安裝 icons/helloworld-128.png 作為 128px 應用程式圖示... 完成
正在將 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 作為 192px 圓形應用程式圖示... 完成
正在安裝 icons/helloworld-square-48.png 作為 48px 方形應用程式圖示... 完成
正在安裝 icons/helloworld-square-72.png 作為 72px 方形應用程式圖示... 完成
正在安裝 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 作為 432px 自適應應用程式圖示... 完成

[helloworld] 移除不必要的應用程式內容...
移除不必要的應用程式套件內容... 完成

[helloworld] 應用程式已更新。

[helloworld] 啟動應用程式...

注意事項

如果您使用的是最新版本的 Android,您可能會注意到應用程式圖示已改成綠色的蛇形,但圖示的背景是白色,而非淺藍色。我們會在下一步修正這個問題。

(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 設定為 640px 應用程式圖示... 完成
正在將 icons/helloworld-1024.png 設定為 1024px 應用程式圖示... 完成
正在將 icons/helloworld-1280.png 設定為 1280px 應用程式圖示... 完成
正在安裝 icons/helloworld-1920.png 作為 1920px 應用程式圖示... 完成

[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 重新建立並執行應用程式。您不會注意到桌面應用程式有任何改變;但 Android 或 iOS 應用程式現在應該會有淺藍色的閃屏背景。

每當您對 pyproject.toml 做出與原始碼或相依性無關的變更時,都需要像這樣重新建立應用程式。任何對描述、版本號碼、顏色或權限的變更都需要重新建立的步驟。正因如此,當您在開發專案時,不應該手動變更 build 資料夾中的內容,也不應該將 build 資料夾加到您的版本控制系統中。build 資料夾應該被視為完全短暫的 - 是建立系統的輸出,可以在需要時重新建立,以反映專案的目前配置。

新增執行時圖示

當要在應用程式介面上加入圖示時,這類圖示必須與應用程式圖示分開存放在不同的目錄中。右擊 Tiberius the yak,將圖像儲存為 .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

現在 runtime 圖示已經就位,讓我們為按鈕加入圖示。Toga 按鈕 widget 只能容納圖示或文字 (不能同時容納),所以讓我們更新按鈕的程式碼,加入執行時的圖示。

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

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

由於 runtime 圖示是捆綁在 Python 套件內的應用程式資源,所以不需要重建或更新資源。此時您可以執行 briefcase dev (或 briefcase run) 來查看新增到按鈕上的圖示。