J'ai soudainement voulu créer une application dans la barre de menus. Tout d'abord, quelle est la barre de menu ici ↓ Après avoir étudié ce que je peux faire, j'ai décidé de créer une application météo.
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.
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
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.
@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.
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
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. https://github.com/hiro1112/WeatherApp
--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