[PYTHON] Créez une application météo résidente dans la barre de menus Mac avec des croupes!

Je souhaite créer une application résidente dans la barre de menus!

J'ai soudainement voulu créer une application dans la barre de menus. Tout d'abord, quelle est la barre de menu ici ↓ menubar.png Après avoir étudié ce que je peux faire, j'ai décidé de créer une application météo.

Qu'est-ce que la croupe

Je pense que beaucoup de gens utiliseront Objective-C ou Swift pour développer la barre de menus Mac. (Peut-être) Il existe des croupes en tant que bibliothèque pour créer facilement une barre de menus Mac en Python. https://github.com/jaredks/rumps Les applications qui utilisent des croupes sont introduites, je les ai donc utilisées comme référence.

Préparation

Installez ce dont vous avez besoin pour utiliser les croupes. Commençons par python3. (Si vous l'avez déjà installé, veuillez l'ignorer) Tout d'abord, installez pyenv, ce qui facilite le basculement entre les versions de Python.

$ brew install pyenv

Après avoir installé pyenv, ajoutez ce qui suit à votre .bash_profile dans votre répertoire personnel:

.bash_profile


export PYENV_ROOT=${HOME}/.pyenv
if [ -d "${PYENV_ROOT}" ]; then
   export PATH=${PYENV_ROOT}/bin:$PATH
   eval "$(pyenv init -)"
fi
$ source ~/.bash_profile
$ pyenv install 3.7.7
$ pyenv global 3.7.7
$ python -V
Python 3.7.7
$ pip -V
pip 19.2.3 from /Users/Nom d'utilisateur/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pip (python 3.7)

Ensuite, nous allons construire l'environnement avec venv. Il est pratique d'utiliser venv car vous pouvez gérer l'état d'installation des packages par pip pour chaque projet.

$ mkdir weather
$ cd weather
$ python -m venv venv
$ . venv/bin/activate
(venv) $ pip install rumps

Comment utiliser

Commençons par l'exemple de programme Rumps ci-dessous.

sample.py


import rumps

class RumpsTest(rumps.App):
    @rumps.clicked("Hello World")
    def hello_world(self, _): 
        rumps.alert("Hello World!")

    @rumps.clicked("Check")
    def check(self, sender):
        sender.state = not sender.state

    @rumps.clicked("Notify")
    def sayhello(self, _): 
        rumps.notification("Hello", "hello", "hello world")

if __name__ == "__main__":
    RumpsTest("Rumps Test").run()
(venv) $ python sample.py

Lorsque j'exécute le programme, le titre du test Rumps apparaît dans la barre de menus Mac. Cliquez sur le titre de Rumps Test et vous verrez ce qui suit. sample_1.png

@rumps.clicked("Hello World") #En écrivant avant la fonction, un Hello World cliquable sera ajouté à la liste.
def hello_world(self, _):
    rumps.alert("Hello World!") # Hello World!L'alerte s'affiche.
sender.state = not sender.state #Chaque fois que vous cliquez sur Vérifier, l'expéditeur.l'état passe à 1 ou 0.
rumps.notification("Hello", "hello","hello world") # title, subtitle,le message est notifié.

Vous pouvez facilement créer une application de barre de menus comme celle-ci. Créons en fait une application météo.

Essayez de créer une application météo

Cette fois, nous utiliserons l'API de liveoor Weather Hacks pour obtenir les informations météorologiques. http://weather.livedoor.com/weather_hacks/webservice Utilisez des requêtes Python pour récupérer les données.

(venv) $ pip install requests

Je vais le créer avec le nom de fichier weather.py.

weather.py


import rumps
import requests

# Livedoor weather api
URL = 'http://weather.livedoor.com/forecast/webservice/json/v1'


class Weather(rumps.App):
    @rumps.clicked("Get weather")
    def get_weather(self, _):
        payload = {'city': '130010'} #130010 est l'indicatif régional de Tokyo à Tokyo.
        data = requests.get(URL, params=payload).json()
        tenki = data['forecasts'][0]['telop']
        rumps.alert(tenki)


if __name__ == "__main__":
    Weather("Weather").run()

Cliquez sur Obtenir la météo pour spécifier la région de Tokyo à Tokyo J'ai pu obtenir les prévisions météorologiques et les afficher dans l'alerte.

Comme l'indicatif régional de Tokyo est entré directement, il n'est pas pratique si vous ne connaissez pas l'indicatif régional. Obtenez la liste des indicatifs régionaux et utilisez Tokyo comme clé pour pouvoir entrer l'indicatif régional. Obtenez le xml publié par Livedoor et stockez-le dans le dictionnaire.

weather.py


import rumps
import requests

# Livedoor weather api
URL = 'http://weather.livedoor.com/forecast/webservice/json/v1'

# City list
XML = "http://weather.livedoor.com/forecast/rss/primary_area.xml"


class Weather(rumps.App):
    @rumps.clicked("Get weather")
    def get_weather(self, _): 
        self.area = self.get_city()
        payload = {'city': self.area[('Tokyo', 'Tokyo')]} #Vous avez spécifié la zone, pas l'indicatif régional.
        data = requests.get(URL, params=payload).json()
        tenki = data['forecasts'][0]['telop']
        rumps.alert(tenki)

    def get_city(self):
        area = {}
        src = et.fromstring(requests.get(XML).text)[0][12]
        for c in src.findall("pref"):
            for cc in c.findall("city"):
                key = (c.attrib["title"], cc.attrib["title"])
                area[key] = cc.attrib["id"]
        return area # {('Préfectures', 'zone'): 'Indicatif régional'}C'est un dictionnaire sous la forme de.


if __name__ == "__main__":
    Weather("Weather").run()

Tokyo J'ai pu connaître la météo à Tokyo, mais aimeriez-vous voir la météo dans d'autres régions également? Ensuite, rendons possible la visualisation des informations météo de la zone sélectionnée dans la liste des zones. Je voudrais cliquer sur une zone pour m'alerter des informations météorologiques pour cette zone.

weather.py


    @rumps.clicked("Tokyo Tokyo")
    def get_weather(self, _): 
        self.area = self.get_city()
        payload = {'city': self.area[('Tokyo', 'Tokyo')]}

Il est difficile d'écrire comme ci-dessus pour toutes les régions, alors jouons un peu avec.

weather.py


class Weather(rumps.App):
    def __init__(self, name):
        super(Weather, self).__init__(
            "Weather",
            menu=[
                rumps.MenuItem("Get weather", callback=self.get_weather)
            ]   
        )   

    def get_weather(self, _): 
        self.area = self.get_city()
        payload = {'city': self.area[('Tokyo', 'Tokyo')]}
        data = requests.get(URL, params=payload).json()
        tenki = data['forecasts'][0]['telop']
        rumps.alert(tenki)

J'ai mis un constructeur et supprimé la décoration get_weather. Au lieu de décorer, j'ai utilisé des croupes.MenuItem et je l'ai modifié pour qu'il fonctionne à peu près de la même manière. Je voudrais pouvoir sélectionner une région d'ici.

weather.py


class Weather(rumps.App):
    def __init__(self, name):
        super(Weather, self).__init__(
            "Weather",
            menu=[
                self.build_area()
            ]
        )

    def build_area(self):
        self.area = self.get_city()
        menu = rumps.MenuItem("Area")
        for (pref, area), code in self.area.items():
            title = "{} {}".format(pref, area)
            menu[title] = rumps.MenuItem(title)
        return menu
sample_2.png

Je pense que cela ressemble à l'image pour le moment. Ensuite, cliquez sur la zone pour l'afficher dans l'alerte.

weather.py


    def build_area(self):
        self.area = self.get_city()
        menu = rumps.MenuItem("Area")
        for (pref, area), code in self.area.items():
            def get_weather(sender):
                payload = {'city': code}
                data = requests.get(URL, params=payload).json()
                tenki = data['forecasts'][0]['telop']
                rumps.alert(tenki)
            title = "{} {}".format(pref, area)
            menu[title] = rumps.MenuItem(title, callback=get_weather)
        return menu

J'ai essayé de faire comme ça. Pour le moment, transformons ce programme en une application (sous la forme de weather.app).

(venv) $ pip install py2app
(venv) $ py2applet --make-setup weather.py

Je pense que l'exécution de la commande py2applet a généré setup.py. Ajoutez un peu à setup.py.

setup.py


"""                                                                           
This is a setup.py script generated by py2applet

Usage:
    python setup.py py2app
"""

from setuptools import setup

APP = ['weather.py']
DATA_FILES = []
OPTIONS = { 
        'plist': {
            'LSUIElement': True, #Si spécifié, il ne sera pas affiché dans le Dock.
        }   
}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)
(venv) $ python setup.py py2app
...
...
ValueError: '/Users/Nom d'utilisateur/.pyenv/versions/3.7.7/lib/libpython3.7.dylib' does not exist

J'ai eu une erreur dans mon environnement. Je n'ai pas libpython3.7.dylib, alors réinstallez Python 3.7.7. Au moment de l'installation, il y a des informations que vous pouvez ajouter --enable-shared, donc je vais l'essayer.

(venv) $ deactive
$ cd
$ pyenv uninstall 3.7.7
$ PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.7
$ ls /Users/Nom d'utilisateur/.pyenv/versions/3.7.7/lib/
libpython3.7m.dylib   libpkgconfig   python3.7

En python3.7.7, c'était libpython3.7m.dylib. (En python3.8.0, c'était libpython3.8.dylib.) Je n'ai pas pu m'en empêcher, j'ai donc renommé libpython3.7m.dylib en libpython3.7.dylib.

$ mv /Users/Nom d'utilisateur/.pyenv/versions/3.7.7/lib/libpython3.7m.dylib /Users/Nom d'utilisateur/.pyenv/versions/3.7.7/lib/libpython3.7.dylib

Exécutez à nouveau setup.py.

$ cd weather
$ . venv/bin/activate
(venv) $ python setup.py py2app
...
...
Done!

J'ai réussi à faire les choses correctement. Je pense que l'application de la barre de menus fonctionne en exécutant l'application contenue dans dist.

Comment était-ce. Vous pouvez facilement créer une application météo!

J'ai beaucoup parlé de l'application de croupe faite par d'autres personnes. https://shinaji.bitbucket.io/2014/09/08/manu_bar_app.html https://github.com/rbrich/computer-time/

Enfin, je l'ai amélioré pour le rendre plus facile à utiliser. sample_2.png https://github.com/hiro1112/WeatherApp

Tâche

--Je veux le rendre inopérant lorsque le réseau n'est pas connecté Je veux savoir si le réseau est connecté sans communiquer depuis python. (Je veux vérifier toutes les secondes)

―― Depuis que j'utilise Python, je souhaite ajouter des fonctions d'apprentissage automatique! !! Je souhaite utiliser les informations météorologiques pour fournir des informations utiles aux utilisateurs de l'application. Je voulais faire quelque chose avec l'exploration de texte en utilisant des informations telles que Twitter.

Recommended Posts

Créez une application météo résidente dans la barre de menus Mac avec des croupes!
Créons une application Mac avec Tkinter et py2app
Créez une application de bureau avec Python avec Electron
[Pratique] Créez une application Watson avec Python! # 2 [Fonction de traduction]
[Pratique] Créez une application Watson avec Python! # 1 [Discrimination linguistique]
[Pratique] Créez une application Watson avec Python! # 3 [Classification du langage naturel]
[Django] Créer un menu déroulant
Faites une loterie avec Python
Faire un feu avec kdeplot
Créez une application de scraping avec Python + Django + AWS et modifiez les tâches
Faites un son avec le notebook Jupyter
Faisons une rupture de bloc avec wxPython
Créer un système de recommandation avec python
Créer un filtre avec un modèle django
Faisons un graphe avec python! !!
Faisons un spacon avec xCAT
Créer un itérateur de modèle avec PySide
Faire un joli graphique avec plotly
Tweet la météo avec bot
Faisons un jeu de shiritori avec Python
Créer un lecteur vidéo avec PySimpleGUI + OpenCV
Jouez comme une application Web avec ipywidgets
Créez un pipeline de notebook avec Kedro + Papermill
Créer une application graphique avec Tkinter de Python
Faire une figure partiellement zoomée avec matplotlib
Démonisez une application Web Python avec Supervisor
Créez un quiz de dessin avec kivy + PyTorch
Faisons la voix lentement avec Python
Créez un classificateur en cascade avec Google Colaboratory
Faisons un langage simple avec PLY 1
Qt pour l'application de bureau de l'application Python
Créez une application Web simple avec Flask
Faire un circuit logique avec Perceptron (Perceptron multicouche)
Faire Oui Non Popup avec Kivy
Faire une minuterie de lavage-séchage avec Raspberry Pi
Créer une animation GIF avec surveillance des dossiers
Créez un framework Web avec Python! (1)
Faisons une IA à trois yeux avec Pylearn 2
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
Créons une application qui affaiblit les nerfs avec Vue.js et Django-Rest-Framework [Partie 2] ~ Configuration de Vue ~
Faisons une application qui affaiblit les nerfs avec Vue.js et Django-Rest-Framework [Partie 1] ~ Django setup ~
Une nouvelle forme d'application qui fonctionne avec GitHub: Comment créer des applications GitHub