Sind Sie bereit, eine coole City Hall Clock-App für Ihren Mac zu erstellen? Großartig! Wir werden eine App erstellen, die in Ihrer Menüleiste angezeigt wird, alle 15 Minuten ertönt und sogar die Stunden zählt. Lass es uns Schritt für Schritt aufschlüsseln und ich erkläre jeden Teil des Codes, damit du verstehst, was vor sich geht.
Unsere Rathausuhr-App wird:
Das Wichtigste zuerst: Lassen Sie uns unser Projekt einrichten:
mkdir CityHallClock cd CityHallClock
go mod init cityhallclock
go get github.com/getlantern/systray go get github.com/faiface/beep
Jetzt erstellen wir unsere main.go-Datei und gehen jede Funktion durch:
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)
Lassen Sie uns jede Funktion aufschlüsseln:
func main() { initAudio() systray.Run(onReady, onExit) }
Hier beginnt unsere App. Es macht zwei wichtige Dinge:
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) } }
Diese Funktion richtet unser Audio ein:
Wenn etwas schief geht (z. B. wenn die Sounddatei nicht gefunden wird), wird der Fehler protokolliert und beendet.
func onReady() { systray.SetIcon(getIcon()) systray.SetTitle("City Hall Clock") systray.SetTooltip("City Hall Clock") mQuit := systray.AddMenuItem("Quit", "Quit the app") go func() {Diese Funktion richtet unser Menüleistensymbol ein:
- Legt das Symbol fest (mit getIcon()).
- Legt den Titel und den Tooltip fest.
- Fügt dem Menü die Option „Beenden“ hinzu.
- Beginnt zu warten, wenn auf die Option „Beenden“ geklickt wird.
- Startet den Betrieb unserer Uhr (in einer separaten Goroutine, damit sie nicht blockiert).
4. onExit()-Funktion
func onExit() { // Cleanup tasks go here }Diese Funktion wird aufgerufen, wenn die App beendet wird. Wir machen hier nichts, aber Sie können bei Bedarf Bereinigungsaufgaben hinzufügen.
5. runClock()-Funktion
func runClock() { ticker := time.NewTicker(time.Minute) defer ticker.Stop() for { select { case t :=Das ist das „Herz“ unserer Uhr:
- Es wird ein Ticker erstellt, der jede Minute „tickt“.
- In einer Endlosschleife prüft es jede Minute die Zeit.
- Wenn es die späteste Stunde oder Viertel nach ist, löst es den Glockenschlag aus.
6. chime() Funktion
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; iDiese Funktion spielt unsere Glockenspiele:
- Es ermittelt, wie oft geläutet werden soll (einmal für Viertelstunden oder die Zahl der Stunden am Anfang der vollen Stunde).
- Dann wird der Glockenton so oft abgespielt, mit einer kurzen Pause zwischen den Glockenschlägen.
7. getIcon()-Funktion
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 }Diese Funktion ruft unser Menüleistensymbol ab:
- Es findet heraus, wo unsere App ausgeführt wird.
- Sucht die Symboldatei im Ressourcenverzeichnis.
- Liest die Symboldatei und gibt ihren Inhalt zurück.
Erstellen des macOS-Anwendungspakets
Um unsere App zu einem echten macOS-Bürger zu machen, müssen wir ein Anwendungspaket erstellen. Dazu gehört das Erstellen einer Info.plist-Datei:
CFBundleExecutable CityHallClock CFBundleIconFile AppIcon CFBundleIdentifier com.yourcompany.cityhallclock CFBundleName City Hall Clock CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleVersion 1 LSMinimumSystemVersion 10.12 LSUIElement NSHighResolutionCapable Speichern Sie dies als Info.plist in Ihrem Projektverzeichnis.
Hinzufügen benutzerdefinierter Symbole
Wir benötigen zwei Symbole:
- Menüleistensymbol: Erstellen Sie ein 22x22 Pixel großes PNG mit dem Namen icon.png.
- App-Symbol: Erstellen Sie eine .icns-Datei:
- Erstellen Sie Bilder mit einer Größe von 16 x 16 bis 1024 x 1024 Pixel.
- Speichern Sie sie in AppIcon.iconset mit Namen wie icon_16x16.png.
- Führen Sie Folgendes aus: iconutil -c icns AppIcon.iconset
Bauen und Verpacken
Lassen Sie uns ein Build-Skript (build.sh) erstellen:
#!/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"Machen Sie es mit chmod x build.sh ausführbar und führen Sie es dann mit ./build.sh aus.
Abschluss
Und da haben Sie es! Sie haben eine voll funktionsfähige City Hall Clock-App für macOS erstellt. Sie haben Folgendes erfahren:
Sie können dies gerne näher erläutern. Fügen Sie möglicherweise Präferenzen für benutzerdefinierte Glockenspiele oder unterschiedliche Glockenspielintervalle hinzu. Der Himmel ist die Grenze!
Sie können den vollständigen Quellcode hier finden: https://github.com/rezmoss/citychime
Viel Spaß beim Codieren und viel Spaß mit Ihrer neuen Uhr!
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3