Les informations de retard de la route spécifiée sont acquises à partir des "informations de route yahoo" et affichées sur l'écran avec GUI. Vous pouvez voir les informations de fonctionnement sur votre smartphone, mais lorsque vous êtes pressé de quitter la maison, il est difficile de vérifier. Par conséquent, nous avons créé un affichage des informations de fonctionnement en temps réel à installer à l'entrée.
python 3.7.3 Raspberry pi 3B+ BeautifulSoup4 tkinter Boîtier de support d'affichage pour Kuman 7 pouces Raspberry Pi Écran 7 pouces (7INCH_HDMI_LCD-PK)
sudo apt-get install python3-tk
sudo apt-get install python3-pil python3-pil.imagetk
# Sujet principal
## Obtenez l'état de l'opération avec les informations de fonctionnement de Yahoo
Utilisez les requêtes et beautifulsoup4 pour récupérer l'état de fonctionnement des itinéraires enregistrés.
J'ai fait référence à ce site pour l'algorithme.
https://qiita.com/hirohiroto522/items/6ff29be1344be805ecb0
## Obtenez une image de l'état de l'opération
Créez un programme qui change l'icône en fonction de l'état de l'opération. Téléchargez l'image de l'icône depuis [ICOOON MONO](https://icooon-mono.com/) ou [Distributing icons!](Http://icon.touch-slide.jp/).
Mettez l'image téléchargée dans le répertoire "img". La structure des dossiers est la suivante.
train_info/img
-train.png
-warning.png
train_info/train_info_gui.py
## Affichage de l'état de fonctionnement avec tkinter
Comment utiliser tkinter
https://python.keicode.com/advanced/tkinter.php
Je pense que ce sera utile.
## Code source
#### **`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
#La chaîne de caractères acquise s'affiche telle quelle sous l'image de l'icône
#Créer la fenêtre principale
root = Tk()
#Taille de la fenêtre principale
root.geometry("1024x600")
#Titre de la fenêtre principale
root.title("info")
url_dict = {
"Ligne Yamate": 'https://transit.yahoo.co.jp/traininfo/detail/21/0/', "Voie centrale": 'https://transit.yahoo.co.jp/traininfo/detail/38/0/',
"Ligne Saikyo": 'https://transit.yahoo.co.jp/traininfo/detail/50/0/', "Ligne Shonan Shinjuku": 'https://transit.yahoo.co.jp/traininfo/detail/25/0/',"Chemin de fer électrique de Choshi":'https://transit.yahoo.co.jp/traininfo/detail/181/0/'
}
train_list = [
"Voie centrale", "Ligne Yamate", "Ligne Saikyo", "Ligne Shonan Shinjuku","Chemin de fer électrique de Choshi"
]
#Classe MainFrame
class MainFrame(ttk.Frame):
#constructeur
def __init__(self, master=None, **kwargs):
#Appelez le constructeur de classe parent
super().__init__(master, **kwargs)
# create_Widgets d'appel
self.create_widgets()
#Créer un widget
def create_widgets(self):
#Créer un cadre
self.frame = Frame(self, bg="AntiqueWhite2", bd=0, height=200, relief="flat")
#Placer le cadre
self.frame.grid(row=0, column=0, columnspan=8, sticky="news")
#Chemin absolu pour ce script
self.scr_path = os.path.dirname(os.path.abspath(sys.argv[0]))
#Afficher le titre
self.wt=Label(self.frame, text="Informations sur le fonctionnement de l'itinéraire", bg="AntiqueWhite2", font=("", 80))
self.wt.place(width=800, x=100, y=10)
#Icône d'informations sur l'opération (dictionnaire)
self.icon_dict = {
"normal": Image.open(self.scr_path + "/img/train.png "), "trouble": Image.open(self.scr_path + "/img/warning.png ")
}
#Ajuster la taille de l'icône à la taille de l'écran (64x64)
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])
#Liste des itinéraires
self.wwl = [
Label(self, text="Voie centrale", bg="red", font=("", 30, "bold")),
Label(self, text="Ligne Yamate", bg="lawn green", font=("", 30, "bold")),
Label(self, text="Ligne Saikyo", bg="green", font=("", 30, "bold")),
Label(self, text="Ligne Shonan Shinjuku", bg="orange", font=("", 30, "bold")),
Label(self, text="Chemin de fer électrique de Choshi", bg="DarkOrange", font=("", 30, "bold"))
]
#Placer l'itinéraire
for i in range(len(self.wwl)):
self.wwl[i].grid(row=1, column=i, sticky="news")
#Dictionnaire de placement initial des icônes d'opération
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")
]
#Placer l'icône d'opération
for i in range(len(self.wwi)):
self.wwi[i].grid(row=2, column=i, sticky="news")
#Situation de conduite
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))
]
#Placez la situation de conduite
for i in range(len(self.wwt)):
self.wwt[i].grid(row=3, column=i, sticky="news")
#Disposition
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)
#Placer le cadre principal
app = MainFrame(root)
app.pack(side=TOP, expand=1, fill=BOTH)
#Fermer la fenêtre principale
def wm_close():
root.destroy()
#Créer un bouton de fermeture
btn = Button(root, text=" X ", font=('', 16), relief=FLAT, command=wm_close)
#Lorsque l'écran est redimensionné
def change_size(event):
#Position du bouton en haut à droite
btn.place(x=root.winfo_width() - 60, y=14)
#Redimensionner l'écran de liaison
root.bind('<Configure>', change_size)
#Agrandir la fenêtre principale
#root.attributes("-zoom", "1")
root.attributes("-fullscreen", "1")
#Toujours au premier plan
root.attributes("-topmost", True)
def update_train_info():
count = 0
app.wt
#Obtenir les informations de fonctionnement des itinéraires enregistrés
for item in train_list:
web_requests = requests.get(url_dict[item])
#Analysez les pages Web avec BeautifulSoup
soup = BeautifulSoup(
web_requests.text, 'html.parser')
# .Trouvez la balise dd de classe de problème avec find
if soup.find('dd', class_='normal'):
status = "normal"
trouble_text="Fonctionnement normal"
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) #Affichage du nom de l'itinéraire
#Affiché avec l'icône d'informations de fonctionnement
app.wwi[count].configure(image=app.icon_dict[status],bg=bg)
#Afficher les informations de fonctionnement
app.wwt[count].configure(text="{0}".format(trouble_text),bg="AntiqueWhite2")
#Mettre à jour le compteur d'affichage
count += 1
root.after(300000, update_train_info)
return
#Premier départ
update_train_info()
#Enregistrer une fonction de rappel
root.after(300000, update_train_info)
#Boucle principale
root.mainloop()
L'icône du train s'affiche pendant le fonctionnement normal et les informations sont affichées avec la marque de danger en cas de panne. Concernant l'implémentation, reportez-vous à [Python] Raspberry Pi Table Clock with Weather Forecast added. J'étais autorisé à le faire. Il est mis à jour toutes les 5 minutes. La couleur d'arrière-plan est http://www.tcl.tk/man/tcl8.4/TkCmd/colors.htm Je l'ai ajusté en appliquant les couleurs répertoriées dans.
05/10 postscript
Comme vous l'avez souligné, il n'a été exécuté qu'une seule fois après 5 minutes et il ne s'agissait pas d'une exécution régulière.
En ajoutant root.after (300000, update_train_info)
à la fin dedef update_train_info ()
pour en faire un appel récursif, il est devenu une exécution régulière. Merci beaucoup.
Enfin, j'ai attaché le support pour le montrer sur l'écran de 7 pouces.
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