Anzeigen von Zugverzögerungsinformationen in der GUI mithilfe von Python

Überblick

Die Verzögerungsinformationen der angegebenen Route werden aus "Yahoo-Routeninformationen" erfasst und auf dem Display mit GUI angezeigt. Sie können die Betriebsinformationen auf Ihrem Smartphone sehen, aber wenn Sie es eilig haben, das Haus zu verlassen, ist es schwierig, dies zu überprüfen. Aus diesem Grund haben wir eine Echtzeit-Anzeige mit Betriebsinformationen erstellt, die am Eingang installiert werden soll.

Umgebung

python 3.7.3 Raspberry pi 3B+ BeautifulSoup4 tkinter Displayhalterung für Kuman 7 Zoll Raspberry Pi 7-Zoll-Display (7INCH_HDMI_LCD-PK)

Vorbereitung

sudo apt-get install python3-tk

sudo apt-get install python3-pil python3-pil.imagetk


# Hauptthema
## Erhalten Sie den Betriebsstatus mit Yahoo-Betriebsinformationen
 Verwenden Sie Anfragen und beautifulsoup4, um den Betriebsstatus registrierter Routen zu überprüfen.
 Ich habe auf diese Seite für den Algorithmus verwiesen.
https://qiita.com/hirohiroto522/items/6ff29be1344be805ecb0

## Holen Sie sich ein Bild des Betriebsstatus
 Erstellen Sie ein Programm, das das Symbol je nach Betriebsstatus ändert. Laden Sie das Symbolbild von [ICOOON MONO](https://icooon-mono.com/) oder [Verteilen von Symbolen!](Http://icon.touch-slide.jp/) herunter.

 Legen Sie das heruntergeladene Bild im Verzeichnis "img" ab. Die Ordnerstruktur ist wie folgt.
train_info/img
-train.png
-warning.png
train_info/train_info_gui.py

## Betriebsstatusanzeige mit tkinter
 So bedienen Sie tkinter
https://python.keicode.com/advanced/tkinter.php
 Ich denke es wird hilfreich sein.
## Quellcode

#### **`train_info_gui.py`**
```py

from tkinter import *
import tkinter.ttk as ttk
import os
import requests
from bs4 import BeautifulSoup

from PIL import Image, ImageTk
from datetime import datetime, timedelta
import time
import textwrap
#Die erfasste Zeichenfolge wird so angezeigt, wie sie sich unter dem Symbolbild befindet
#Hauptfenster erstellen
root = Tk()

#Größe des Hauptfensters
root.geometry("1024x600")

#Titel des Hauptfensters
root.title("info")
url_dict = {
    "Yamate Line": 'https://transit.yahoo.co.jp/traininfo/detail/21/0/', "Mittelspur": 'https://transit.yahoo.co.jp/traininfo/detail/38/0/',
    "Saikyo-Linie": 'https://transit.yahoo.co.jp/traininfo/detail/50/0/', "Shonan Shinjuku Linie": 'https://transit.yahoo.co.jp/traininfo/detail/25/0/',"Choshi Electric Railway":'https://transit.yahoo.co.jp/traininfo/detail/181/0/'
}
train_list = [
    "Mittelspur", "Yamate Line", "Saikyo-Linie", "Shonan Shinjuku Linie","Choshi Electric Railway"
]

#MainFrame-Klasse


class MainFrame(ttk.Frame):
    #Konstrukteur
    def __init__(self, master=None, **kwargs):
        #Rufen Sie den Konstruktor der übergeordneten Klasse auf
        super().__init__(master, **kwargs)

        # create_Widgets aufrufen
        self.create_widgets()

    #Erstellen Sie ein Widget
    def create_widgets(self):
        #Erstellen Sie einen Rahmen
        self.frame = Frame(self, bg="AntiqueWhite2", bd=0, height=200, relief="flat")

        #Platziere den Rahmen
        self.frame.grid(row=0, column=0, columnspan=8, sticky="news")

        #Absoluter Pfad für dieses Skript
        self.scr_path = os.path.dirname(os.path.abspath(sys.argv[0]))
        #Titel anzeigen
        self.wt=Label(self.frame, text="Informationen zum Routenbetrieb", bg="AntiqueWhite2", font=("", 80))
        self.wt.place(width=800, x=100, y=10)

        #Funktionsinformationssymbol (Wörterbuch)
        self.icon_dict = {
            "normal": Image.open(self.scr_path + "/img/train.png "), "trouble": Image.open(self.scr_path + "/img/warning.png ")
        }

        #Passen Sie die Symbolgröße an die Bildschirmgröße an (64 x 64).
        for key, value in self.icon_dict.items():
            self.icon_dict[key] = self.icon_dict[key].resize(
                (64, 64), Image.ANTIALIAS)
            self.icon_dict[key] = ImageTk.PhotoImage(self.icon_dict[key])

        #Routenliste
        self.wwl = [
            Label(self, text="Mittelspur",  bg="red", font=("", 30, "bold")),
            Label(self, text="Yamate Line",  bg="lawn green", font=("", 30, "bold")),
            Label(self, text="Saikyo-Linie",  bg="green", font=("", 30, "bold")),
            Label(self, text="Shonan Shinjuku Linie", bg="orange", font=("", 30, "bold")),
            Label(self, text="Choshi Electric Railway", bg="DarkOrange", font=("", 30, "bold"))

        ]

        #Platzieren Sie die Route
        for i in range(len(self.wwl)):
            self.wwl[i].grid(row=1, column=i, sticky="news")

        #Erstplatzierungswörterbuch der Operationssymbole
        self.wwi = [
            Label(self, image=self.icon_dict["normal"], bg="white"),
            Label(self, image=self.icon_dict["normal"], bg="white"),
            Label(self, image=self.icon_dict["normal"], bg="white"),
            Label(self, image=self.icon_dict["normal"], bg="white"),
            Label(self, image=self.icon_dict["normal"], bg="white")
        ]

        #Platzieren Sie das Operationssymbol
        for i in range(len(self.wwi)):
            self.wwi[i].grid(row=2, column=i, sticky="news")

        #Fahrsituation
        self.wwt = [
            Label(self, text="0", bg="white", font=("", 20)),
            Label(self, text="0", bg="white", font=("", 20)),
            Label(self, text="0", bg="white", font=("", 20)),
            Label(self, text="0", bg="white", font=("", 20)),
            Label(self, text="0", bg="white", font=("", 20))

        ]

        #Fahrsituation platzieren
        for i in range(len(self.wwt)):
            self.wwt[i].grid(row=3, column=i, sticky="news")

        #Layout
        self.rowconfigure(0, weight=1)
        self.rowconfigure(1, weight=1)
        self.rowconfigure(2, weight=1)
        self.rowconfigure(3, weight=1)
        self.rowconfigure(4, weight=1)
        for i in range(len(self.wwl)):
            self.columnconfigure(i, weight=1)


#Platzieren Sie den Hauptrahmen
app = MainFrame(root)
app.pack(side=TOP, expand=1, fill=BOTH)

#Hauptfenster schließen


def wm_close():
    root.destroy()


#Schaltfläche zum Schließen erstellen
btn = Button(root, text=" X ", font=('', 16), relief=FLAT, command=wm_close)

#Wenn die Größe des Bildschirms geändert wird


def change_size(event):
    #Tastenposition oben rechts
    btn.place(x=root.winfo_width() - 60, y=14)


#Bildschirmgröße binden
root.bind('<Configure>', change_size)

#Maximieren Sie das Hauptfenster
#root.attributes("-zoom", "1")
root.attributes("-fullscreen", "1")

#Immer im Vordergrund
root.attributes("-topmost", True)


def update_train_info():

    count = 0
    app.wt
    #Erhalten Sie Betriebsinformationen zu registrierten Routen
    for item in train_list:
        web_requests = requests.get(url_dict[item])

        #Analysieren Sie Webseiten mit BeautifulSoup
        soup = BeautifulSoup(
            web_requests.text, 'html.parser')
            
        # .Finden Sie das Trouble Class DD-Tag mit find
        if soup.find('dd', class_='normal'):
            status = "normal"
            trouble_text="Normale Operation"
            bg="green yellow"
        else:
            status = "trouble"
            text_list=textwrap.wrap(soup.find('dd',class_='trouble').get_text(), 10)
            trouble_text='\n'.join(text_list)
            bg="red4"
        app.wwl[count].configure(text=item)  #Anzeige des Routennamens
        #Wird mit dem Symbol für Betriebsinformationen angezeigt
        app.wwi[count].configure(image=app.icon_dict[status],bg=bg)

        #Betriebsinformationen anzeigen
        app.wwt[count].configure(text="{0}".format(trouble_text),bg="AntiqueWhite2")

        #Anzeigezähler aktualisieren
        count += 1
  root.after(300000, update_train_info)
    return


#Erster Start
update_train_info()

#Registrieren Sie eine Rückruffunktion

root.after(300000, update_train_info)

#Hauptschleife
root.mainloop()

Kommentar

Das Zugsymbol wird während des normalen Betriebs angezeigt, und die Gefahrenmarkierung wird angezeigt, und Informationen werden angezeigt, wenn ein Fehler auftritt. Informationen zur Implementierung finden Sie unter [Python] Himbeer-Pi-Tischuhr mit hinzugefügter Wettervorhersage. Ich durfte. Es wird alle 5 Minuten aktualisiert. Die Hintergrundfarbe ist http://www.tcl.tk/man/tcl8.4/TkCmd/colors.htm Ich habe es angepasst, während ich die in aufgeführten Farben angewendet habe.

05/10 Nachtrag Wie Sie bereits betont haben, wurde es nur einmal nach 5 Minuten ausgeführt und war keine reguläre Ausführung. Durch Hinzufügen von "root.after (300000, update_train_info)" am Ende von "def update_train_info ()", um es zu einem rekursiven Aufruf zu machen, wurde es zu einer regulären Ausführung. Vielen Dank.

Fertiges Produkt

Schließlich habe ich den Ständer angebracht, um ihn auf dem 7-Zoll-Display anzuzeigen. 20200509_175223 (2).jpg

Referenz

https://myenigma.hatenablog.com/entry/2017/09/15/150945#%E7%94%BB%E5%83%8F%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%81%A8Widget%E3%81%AE%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E9%85%8D%E7%BD%AE https://qiita.com/nnahito/items/ad1428a30738b3d93762#%E5%9F%BA%E7%A4%8E https://qiita.com/StrayDog/items/203640d9dc7c801dad0f

Recommended Posts

Anzeigen von Zugverzögerungsinformationen in der GUI mithilfe von Python
GUI-Programmierung in Python mit Appjar
Erstellen Sie mit tkinter eine Python-GUI
GUI-Erstellung in Python mit tkinter 2
Informationen zum Erstellen einer GUI mit TKinter of Python
GUI-Erstellung in Python mit tkinter Teil 1
[Python] Fortschrittsanzeige nach Fortschrittsbalken mit tqdm
Mit dem Evernote SDK für Python 3 erhalten Sie Informationen zu Notizen
Scraping mit Python
Anzeigen und Aufnehmen von Webkamerabildern mit Python Kivy [GUI]
Bearbeiten Sie Redmine mit Python Redmine
Fibonacci-Sequenz mit Python
Datenbereinigung mit Python
Verwenden von Python # externen Paketen
Altersberechnung mit Python
[GUI in Python] PyQt5-Dialog-
Suchen Sie Twitter mit Python
Namensidentifikation mit Python
Hinweise zur Verwendung von Python-Unterprozessen
Versuchen Sie es mit Tweepy [Python2.7]
[Blender Python] Zeigen Sie Bilder in 3D-Ansicht mit OpenGL (bgl) an.
Versuchen Sie, verschiedene Informationen anzuzeigen, die für das Debuggen mit Python nützlich sind
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen
Ausgabe von Produktinformationen an csv mithilfe der Rakuten-Produktsuch-API [Python]