Ich wollte plötzlich eine App in der Menüleiste machen. Was ist die Menüleiste hier ↓ Nachdem ich gelernt hatte, was ich tun kann, entschied ich mich für eine Wetter-App.
Ich denke, viele Leute werden Objective-C oder Swift verwenden, um die Mac-Menüleiste zu entwickeln. (Vielleicht) Es gibt Rumps als Bibliothek, um auf einfache Weise eine Mac-Menüleiste in Python zu erstellen. https://github.com/jaredks/rumps Die Apps, die Rumps verwenden, werden vorgestellt, daher habe ich sie als Referenz verwendet.
Installieren Sie, was Sie benötigen, um Rumps zu verwenden. Beginnen wir mit python3. (Wenn Sie es bereits installiert haben, überspringen Sie es bitte) Installieren Sie zunächst pyenv, um den Wechsel zwischen Python-Versionen zu vereinfachen.
$ brew install pyenv
Fügen Sie nach der Installation von pyenv Folgendes zu Ihrem .bash_profile in Ihrem Home-Verzeichnis hinzu:
.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/Nutzername/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pip (python 3.7)
Als nächstes werden wir die Umgebung mit venv bauen. Die Verwendung von venv ist praktisch, da Sie den Installationsstatus von Paketen für jedes Projekt per Pip verwalten können.
$ mkdir weather
$ cd weather
$ python -m venv venv
$ . venv/bin/activate
(venv) $ pip install rumps
Beginnen wir mit dem folgenden Beispielprogramm für Rumps.
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
Wenn ich das Programm starte, wird der Titel Rumps Test in der Mac-Menüleiste angezeigt. Klicken Sie auf den Titel Rumps Test und Sie sehen Folgendes.
@rumps.clicked("Hello World") #Durch Schreiben vor der Funktion wird der Liste eine anklickbare Hello World hinzugefügt.
def hello_world(self, _):
rumps.alert("Hello World!") # Hello World!Warnung wird angezeigt.
sender.state = not sender.state #Jedes Mal, wenn auf Check geklickt wird, Absender.Zustand wechselt auf 1 oder 0.
rumps.notification("Hello", "hello","hello world") # title, subtitle,Nachricht wird benachrichtigt.
Sie können ganz einfach eine Menüleisten-App wie diese erstellen. Lassen Sie uns tatsächlich eine Wetter-App erstellen.
Dieses Mal verwenden wir die Livedoor Weather Hacks API, um die Wetterinformationen abzurufen. http://weather.livedoor.com/weather_hacks/webservice Verwenden Sie Python-Anforderungen, um die Daten abzurufen.
(venv) $ pip install requests
Ich werde es mit dem Dateinamen weather.py erstellen.
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 ist die Vorwahl für Tokio in Tokio.
data = requests.get(URL, params=payload).json()
tenki = data['forecasts'][0]['telop']
rumps.alert(tenki)
if __name__ == "__main__":
Weather("Weather").run()
Klicken Sie auf Wetter abrufen, um den Tokio-Bereich von Tokio anzugeben Ich konnte die Wettervorhersage abrufen und in der Warnung anzeigen.
Da die Vorwahl von Tokio direkt eingegeben wird, ist es unpraktisch, wenn Sie die Vorwahl nicht kennen. Holen Sie sich die Vorwahlliste und verwenden Sie Tokio als Schlüssel, damit Sie die Vorwahl eingeben können. Holen Sie sich die von Livedoor veröffentlichte XML und speichern Sie sie im Wörterbuch.
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[('Tokio', 'Tokio')]} #Sie haben den Bereich angegeben, nicht die Vorwahl.
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äfekturen', 'Bereich'): 'Vorwahl'}Es ist ein Wörterbuch in Form von.
if __name__ == "__main__":
Weather("Weather").run()
Tokio Ich konnte das Wetter in Tokio kennen, aber möchten Sie das Wetter auch in anderen Gebieten sehen? Lassen Sie uns als Nächstes die Wetterinformationen des aus der Gebietsliste ausgewählten Gebiets anzeigen. Ich möchte auf einen Bereich klicken, um mich auf die Wetterinformationen für diesen Bereich aufmerksam zu machen.
weather.py
@rumps.clicked("Tokio Tokio")
def get_weather(self, _):
self.area = self.get_city()
payload = {'city': self.area[('Tokio', 'Tokio')]}
Es ist schwer, wie oben für alle Regionen zu schreiben, also lasst uns ein bisschen damit spielen.
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[('Tokio', 'Tokio')]}
data = requests.get(URL, params=payload).json()
tenki = data['forecasts'][0]['telop']
rumps.alert(tenki)
Ich habe einen Konstruktor eingefügt und die get_weather-Dekoration entfernt. Anstatt zu dekorieren, habe ich rumps.MenuItem verwendet und es so modifiziert, dass es auf die gleiche Weise funktioniert. Ich möchte hier eine Region auswählen können.
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
Ich denke, es sieht vorerst wie das Bild aus. Klicken Sie anschließend auf den Bereich, um ihn in der Warnung anzuzeigen.
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
Ich habe versucht, es so zu machen. Lassen Sie uns dieses Programm vorerst in eine App verwandeln (in Form von weather.app).
(venv) $ pip install py2app
(venv) $ py2applet --make-setup weather.py
Ich denke, das Ausführen des Befehls py2applet hat setup.py generiert. Fügen Sie ein wenig zu setup.py hinzu.
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, #Wenn angegeben, wird es nicht im Dock angezeigt.
}
}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
(venv) $ python setup.py py2app
...
...
ValueError: '/Users/Nutzername/.pyenv/versions/3.7.7/lib/libpython3.7.dylib' does not exist
Ich habe einen Fehler in meiner Umgebung. Ich habe keine libpython3.7.dylib, also installieren Sie Python 3.7.7 neu. Es gibt Informationen, die Sie zum Zeitpunkt der Installation hinzufügen können --enable-shared, also werde ich es versuchen.
(venv) $ deactive
$ cd
$ pyenv uninstall 3.7.7
$ PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.7
$ ls /Users/Nutzername/.pyenv/versions/3.7.7/lib/
libpython3.7m.dylib libpkgconfig python3.7
In python3.7.7 war es libpython3.7m.dylib. (In python3.8.0 war es libpython3.8.dylib.) Ich konnte nicht anders, also habe ich libpython3.7m.dylib in libpython3.7.dylib umbenannt.
$ mv /Users/Nutzername/.pyenv/versions/3.7.7/lib/libpython3.7m.dylib /Users/Nutzername/.pyenv/versions/3.7.7/lib/libpython3.7.dylib
Führen Sie setup.py erneut aus.
$ cd weather
$ . venv/bin/activate
(venv) $ python setup.py py2app
...
...
Done!
Ich habe es geschafft, es richtig zu machen. Ich denke, dass die Menüleistenanwendung funktioniert, indem die in dist enthaltene Anwendung ausgeführt wird.
Wie war das. Sie können ganz einfach eine Wetter-App erstellen!
Ich habe mich sehr auf die Rumps-App anderer Leute bezogen. https://shinaji.bitbucket.io/2014/09/08/manu_bar_app.html https://github.com/rbrich/computer-time/
Schließlich habe ich es verbessert, um die Verwendung zu vereinfachen. https://github.com/hiro1112/WeatherApp
――Da ich Python verwende, möchte ich Funktionen für maschinelles Lernen hinzufügen! !! Ich möchte Wetterinformationen verwenden, um Benutzern der App nützliche Informationen bereitzustellen. Ich wollte etwas mit Text Mining machen, indem ich Informationen wie Twitter verwendete.
Recommended Posts