準備好為您的 Mac 建立一個很酷的市政廳時鐘應用程式了嗎?偉大的!我們將創建一個位於選單欄中的應用程序,每 15 分鐘發出一次提示音,甚至可以計算時間。讓我們一步步分解,我將解釋程式碼的每一部分,以便您能夠理解發生了什麼。
項目概況
我們的市政廳時鐘應用程式將:
- 在 macOS 選單列中顯示時鐘圖示
- 每 15 分鐘鳴響一次
- 在每個小時的頂部敲響小時數
- 在選單列中提供「退出」選項
- 作為正確的 macOS 應用程式運行,無需打開終端機視窗
設定項目
首先,讓我們設定我們的項目:
- 建立一個新目錄:
mkdir CityHallClock cd CityHallClock
- 初始化一個新的Go模組:
go mod init cityhallclock
- 安裝所需的依賴項:
go get github.com/getlantern/systray go get github.com/faiface/beep
主要程式碼
現在,讓我們建立 main.go 檔案並瀏覽每個函數:
package main import ( "bytes" "log" "os" "path/filepath" "time" "github.com/faiface/beep" "github.com/faiface/beep/mp3" "github.com/faiface/beep/speaker" "github.com/getlantern/systray" ) var ( audioBuffer *beep.Buffer ) func main() { initAudio() systray.Run(onReady, onExit) } // ... (other functions will go here)
讓我們分解每個功能:
1.main()函數
func main() { initAudio() systray.Run(onReady, onExit) }
這是我們的應用程式啟動的地方。它做了兩件重要的事:
- 呼叫 initAudio() 來設定我們的鈴聲。
- 運行我們的系統托盤應用程序,告訴它在準備好(onReady)和退出(onExit)時要做什麼。
2.initAudio()函數
func initAudio() { execPath, err := os.Executable() if err != nil { log.Fatal(err) } resourcesPath := filepath.Join(filepath.Dir(execPath), "..", "Resources") chimeFile := filepath.Join(resourcesPath, "chime.mp3") f, err := os.Open(chimeFile) if err != nil { log.Fatal(err) } defer f.Close() streamer, format, err := mp3.Decode(f) if err != nil { log.Fatal(err) } defer streamer.Close() audioBuffer = beep.NewBuffer(format) audioBuffer.Append(streamer) err = speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10)) if err != nil { log.Fatal(err) } }
此函數設定我們的音訊:
- 它會找到我們的應用程式運行的位置並找到鈴聲檔案。
- 開啟 MP3 檔案並進行解碼。
- 建立帶有鈴聲的音訊緩衝區。
- 初始化音訊揚聲器。
如果出現任何問題(例如找不到聲音檔案),它會記錄錯誤並退出。
3.onReady()函數
func onReady() { systray.SetIcon(getIcon()) systray.SetTitle("City Hall Clock") systray.SetTooltip("City Hall Clock") mQuit := systray.AddMenuItem("Quit", "Quit the app") go func() { <p>此函數設定我們的選單列圖示:</p> <ol> <li>設定圖示(使用 getIcon())。 </li> <li>設定標題和工具提示。 </li> <li>在選單中新增「退出」選項。 </li> <li>點選「退出」選項時開始監聽。 </li> <li>開始運行我們的時鐘(在一個單獨的 goroutine 中,這樣它就不會阻塞)。 </li> </ol> <h3> 4.onExit()函數 </h3> <pre class="brush:php;toolbar:false">func onExit() { // Cleanup tasks go here }
當應用程式退出時呼叫此函數。我們在這裡不做任何事情,但您可以根據需要添加清理任務。
5.runClock()函數
func runClock() { ticker := time.NewTicker(time.Minute) defer ticker.Stop() for { select { case t := <p>這是我們時鐘的「心」:</p> <ol> <li>它創建了一個每分鐘「滴答」的股票代碼。 </li> <li>在無限循環中,它每分鐘檢查一次時間。 </li> <li>如果是整點或一刻鐘,則會觸發鈴聲。 </li> </ol> <h3> 6. chime()函數 </h3> <pre class="brush:php;toolbar:false">func chime(t time.Time) { hour := t.Hour() minute := t.Minute() var chimeTimes int if minute == 0 { chimeTimes = hour % 12 if chimeTimes == 0 { chimeTimes = 12 } } else { chimeTimes = 1 } for i := 0; i <p>此功能播放我們的鈴聲:</p> <ol> <li>它計算出鳴響多少次(每刻鐘響一次,或整點整點的小時數)。 </li> <li>然後它會多次播放鈴聲,並在鈴聲之間短暫停頓。 </li> </ol> <h3> 7. getIcon()函數 </h3> <pre class="brush:php;toolbar:false">func getIcon() []byte { execPath, err := os.Executable() if err != nil { log.Fatal(err) } iconPath := filepath.Join(filepath.Dir(execPath), "..", "Resources", "icon.png") // Read the icon file icon, err := os.ReadFile(iconPath) if err != nil { log.Fatal(err) } return icon }
此函數取得我們的選單列圖示:
- 它找到我們的應用程式正在運行的位置。
- 在資源目錄中找到圖示檔。
- 讀取圖示檔案並傳回其內容。
建立 macOS 應用程式包
為了讓我們的應用程式成為真正的 macOS 公民,我們需要建立一個應用程式包。這涉及創建一個 Info.plist 檔案:
<?xml version="1.0" encoding="UTF-8"?> <plist version="1.0"> <dict> <key>CFBundleExecutable</key> <string>CityHallClock</string> <key>CFBundleIconFile</key> <string>AppIcon</string> <key>CFBundleIdentifier</key> <string>com.yourcompany.cityhallclock</string> <key>CFBundleName</key> <string>City Hall Clock</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> <string>1.0</string> <key>CFBundleVersion</key> <string>1</string> <key>LSMinimumSystemVersion</key> <string>10.12</string> <key>LSUIElement</key> <true></true> <key>NSHighResolutionCapable</key> <true></true> </dict> </plist>
將其儲存為專案目錄中的 Info.plist。
添加自訂圖標
我們需要兩個圖示:
- 選單列圖示:建立一個 22x22 像素的 PNG,命名為 icon.png。
- 應用程式圖示:建立 .icns 檔案:
- 製作尺寸為 16x16 到 1024x1024 像素的圖像。
- 將它們保存在 AppIcon.iconset 中,名稱如 icon_16x16.png。
- 運行:iconutil -c icns AppIcon.iconset
建築和包裝
讓我們建立一個建置腳本(build.sh):
#!/bin/bash # Build the Go application go build -o CityHallClock # Create the app bundle structure mkdir -p CityHallClock.app/Contents/MacOS mkdir -p CityHallClock.app/Contents/Resources # Move the executable to the app bundle mv CityHallClock CityHallClock.app/Contents/MacOS/ # Copy the Info.plist cp Info.plist CityHallClock.app/Contents/ # Copy the chime sound to Resources cp chime.mp3 CityHallClock.app/Contents/Resources/ # Copy the menu bar icon cp icon.png CityHallClock.app/Contents/Resources/ # Copy the application icon cp AppIcon.icns CityHallClock.app/Contents/Resources/ echo "Application bundle created: CityHallClock.app"
使用 chmod +x build.sh 使其可執行,然後使用 ./build.sh 運行它。
結論
就是這樣!您已經為 macOS 建立了功能齊全的市政廳時鐘應用程式。您已了解:
- 使用 Go 建立功能表列應用程式
- 以特定時間間隔播放聲音
- 將 Go 應用程式打包為原生 macOS 應用程式
請隨意擴充這一點。也許添加自訂鈴聲或不同鈴聲間隔的首選項。天空才是極限!
您可以在這裡找到完整的原始碼 https://github.com/rezmoss/citychime
快樂編碼,享受你的新時鐘!
以上是為 macOS 建立市政廳時鐘應用程式:綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C 更適合需要直接控制硬件資源和高性能優化的場景,而Golang更適合需要快速開發和高並發處理的場景。 1.C 的優勢在於其接近硬件的特性和高度的優化能力,適合遊戲開發等高性能需求。 2.Golang的優勢在於其簡潔的語法和天然的並發支持,適合高並發服務開發。

Golang在实际应用中表现出色,以简洁、高效和并发性著称。1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

Go語言的核心特性包括垃圾回收、靜態鏈接和並發支持。 1.Go語言的並發模型通過goroutine和channel實現高效並發編程。 2.接口和多態性通過實現接口方法,使得不同類型可以統一處理。 3.基本用法展示了函數定義和調用的高效性。 4.高級用法中,切片提供了動態調整大小的強大功能。 5.常見錯誤如競態條件可以通過gotest-race檢測並解決。 6.性能優化通過sync.Pool重用對象,減少垃圾回收壓力。

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

關於SQL查詢結果排序的疑惑學習SQL的過程中,常常會遇到一些令人困惑的問題。最近,筆者在閱讀《MICK-SQL基礎�...

golang ...

Go語言中如何對比並處理三個結構體在Go語言編程中,有時需要對比兩個結構體的差異,並將這些差異應用到第�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版
好用的JavaScript開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。