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.
python 3.7.3 Raspberry pi 3B+ BeautifulSoup4 tkinter Displayhalterung für Kuman 7 Zoll Raspberry Pi 7-Zoll-Display (7INCH_HDMI_LCD-PK)
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()
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.
Schließlich habe ich den Ständer angebracht, um ihn auf dem 7-Zoll-Display anzuzeigen.
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