Prêt à créer une application cool d'horloge de l'hôtel de ville pour votre Mac ? Super! Nous allons créer une application qui se trouve dans votre barre de menus, sonne toutes les 15 minutes et compte même les heures. Décomposons-le étape par étape et j'expliquerai chaque partie du code afin que vous puissiez comprendre ce qui se passe.
Notre application d'horloge de l'hôtel de ville :
Tout d'abord, mettons en place notre projet :
mkdir CityHallClock cd CityHallClock
go mod init cityhallclock
go get github.com/getlantern/systray go get github.com/faiface/beep
Maintenant, créons notre fichier main.go et parcourons chaque fonction :
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)
Décomposons chaque fonction :
func main() { initAudio() systray.Run(onReady, onExit) }
C'est ici que démarre notre application. Il fait deux choses importantes :
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) } }
Cette fonction configure notre audio :
Si quelque chose ne va pas (comme ne pas trouver le fichier son), il enregistrera l'erreur et quittera.
func onReady() { systray.SetIcon(getIcon()) systray.SetTitle("City Hall Clock") systray.SetTooltip("City Hall Clock") mQuit := systray.AddMenuItem("Quit", "Quit the app") go func() {Cette fonction configure l'icône de notre barre de menu :
- Définit l'icône (à l'aide de getIcon()).
- Définit le titre et l'info-bulle.
- Ajoute une option « Quitter » au menu.
- Commence à écouter lorsque l'option "Quitter" est cliquée.
- Commence à exécuter notre horloge (dans une goroutine séparée pour qu'elle ne bloque pas).
4. Fonction onExit()
func onExit() { // Cleanup tasks go here }Cette fonction est appelée lorsque l'application se ferme. Nous ne faisons rien ici, mais vous pouvez ajouter des tâches de nettoyage si nécessaire.
5. Fonction runClock()
func runClock() { ticker := time.NewTicker(time.Minute) defer ticker.Stop() for { select { case t :=C'est le "cœur" de notre horloge :
- Il crée un ticker qui "coche" toutes les minutes.
- Dans une boucle infinie, il vérifie l'heure toutes les minutes.
- Si l'heure est avancée ou le quart passé, le carillon est déclenché.
6. chime()Fonction
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; iCette fonction joue nos carillons :
- Il calcule combien de fois il faut sonner (une fois par quart d'heure, ou le numéro de l'heure en haut de l'heure).
- Il joue ensuite le son du carillon autant de fois, avec une courte pause entre les carillons.
7. Fonction getIcon()
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 }Cette fonction obtient notre icône de barre de menu :
- Il trouve où notre application est exécutée.
- Localise le fichier icône dans le répertoire Ressources.
- Lit le fichier icône et renvoie son contenu.
Création du bundle d'applications macOS
Pour faire de notre application un véritable citoyen macOS, nous devons créer un bundle d'applications. Cela implique de créer un fichier Info.plist :
CFBundleExecutable CityHallClock CFBundleIconFile AppIcon CFBundleIdentifier com.yourcompany.cityhallclock CFBundleName City Hall Clock CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleVersion 1 LSMinimumSystemVersion 10.12 LSUIElement NSHighResolutionCapable Enregistrez-le sous Info.plist dans le répertoire de votre projet.
Ajout d'icônes personnalisées
Nous avons besoin de deux icônes :
- Icône de la barre de menu : créez un fichier PNG de 22 x 22 pixels nommé icon.png.
- Icône de l'application : créez un fichier .icns :
- Créez des images de 16 x 16 à 1 024 x 1 024 pixels.
- Enregistrez-les dans AppIcon.iconset avec des noms comme icon_16x16.png.
- Exécuter : iconutil -c icns AppIcon.iconset
Bâtiment et emballage
Créons un script de build (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"Rendez-le exécutable avec chmod x build.sh, puis exécutez-le avec ./build.sh.
Conclusion
Et voilà ! Vous avez créé une application City Hall Clock entièrement fonctionnelle pour macOS. Vous avez appris :
N'hésitez pas à développer ce point. Ajoutez peut-être des préférences pour des carillons personnalisés ou différents intervalles de carillon. Le ciel est la limite !
Vous pouvez trouver le code source complet ici https://github.com/rezmoss/citychime
Bon codage et profitez de votre nouvelle horloge !
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3