[PYTHON] Erstellen Sie eine Wetter-App für die Mac-Menüleiste mit Rumpf!

Ich möchte eine App erstellen, die sich in der Menüleiste befindet!

Ich wollte plötzlich eine App in der Menüleiste machen. Was ist die Menüleiste hier ↓ menubar.png Nachdem ich gelernt hatte, was ich tun kann, entschied ich mich für eine Wetter-App.

Was ist Rumpf

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.

Vorbereitung

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

Wie benutzt man

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. sample_1.png

@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.

Versuchen Sie, eine Wetter-App zu 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
sample_2.png

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. sample_2.png https://github.com/hiro1112/WeatherApp

Aufgabe

――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

Erstellen Sie eine Wetter-App für die Mac-Menüleiste mit Rumpf!
Lassen Sie uns eine Mac-App mit Tkinter und py2app erstellen
Erstellen Sie eine Desktop-App mit Python mit Electron
[Übung] Erstellen Sie eine Watson-App mit Python! # 2 [Übersetzungsfunktion]
[Übung] Erstellen Sie eine Watson-App mit Python! # 1 [Sprachdiskriminierung]
[Übung] Erstellen Sie eine Watson-App mit Python! # 3 [Klassifizierung der natürlichen Sprache]
[Django] Erstellen Sie ein Pulldown-Menü
Machen Sie eine Lotterie mit Python
Machen Sie ein Feuer mit kdeplot
Erstellen Sie mit Python + Django + AWS eine Scraping-App und wechseln Sie Jobs
Machen Sie einen Sound mit Jupyter Notebook
Machen wir einen Blockbruch mit wxPython
Erstellen Sie ein Empfehlungssystem mit Python
Machen Sie einen Filter mit einer Django-Vorlage
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Erstellen Sie mit PySide einen Modelliterator
Machen Sie eine schöne Grafik mit Plotly
Tweet die Wettervorhersage mit Bot
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV
Spielen Sie wie eine Web-App mit ipywidgets
Erstellen Sie eine Notebook-Pipeline mit Kedro + Papermill
Erstellen Sie eine GUI-App mit Tkinter of Python
Machen Sie mit matplotlib eine teilweise gezoomte Figur
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
Machen Sie ein Zeichnungsquiz mit kivy + PyTorch
Lassen Sie uns mit Python langsam sprechen
Erstellen Sie einen Kaskadenklassifizierer mit Google Colaboratory
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
Qt für Python App Desktop App
Erstellen Sie eine einfache Web-App mit Flasche
Machen Sie eine Logikschaltung mit Perceptron (Multilayer Perceptron)
Machen Sie Ja Nein Popup mit Kivy
Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Erstellen Sie eine GIF-Animation mit Ordnerüberwachung
Erstellen Sie ein Webframework mit Python! (1)
Machen wir mit Pylearn 2 eine dreiäugige KI
Machen wir einen Twitter-Bot mit Python!
Erstellen Sie ein Webframework mit Python! (2)
Lassen Sie uns mit Vue.js und Django-Rest-Framework [Teil 2] ~ Vue setup ~ eine nervenschwächende App erstellen
Lassen Sie uns mit Vue.js und Django-Rest-Framework [Teil 1] ~ Django-Setup ~ eine nervenschwächende App erstellen
Eine neue Form der App, die mit GitHub funktioniert: So erstellen Sie GitHub-Apps