GUI affiche les informations de retard de train à l'aide de python

Aperçu

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.

environnement

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)

Préparation

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()

Commentaire

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.

Produit fini

Enfin, j'ai attaché le support pour le montrer sur l'écran de 7 pouces. 20200509_175223 (2).jpg

référence

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

GUI affiche les informations de retard de train à l'aide de python
Programmation GUI en Python avec Appjar
Créer une interface graphique python à l'aide de tkinter
Création d'interface graphique en python avec tkinter 2
À propos de la création de l'interface graphique à l'aide de TKinter de Python
Création d'interface graphique en python à l'aide de tkinter partie 1
[Python] Affichage de la progression par barre de progression en utilisant tqdm
Obtenir des informations sur les notes à l'aide du SDK Evernote pour Python 3
Scraping à l'aide de Python
Afficher et prendre des images de caméra Web avec Python Kivy [GUI]
Manipuler Redmine à l'aide de Python Redmine
Séquence de Fibonacci utilisant Python
Nettoyage des données à l'aide de Python
Utilisation des packages Python #external
Calcul de l'âge à l'aide de python
[GUI en Python] PyQt5-Dialog-
Rechercher sur Twitter avec Python
Identification de nom à l'aide de python
Notes sur l'utilisation de sous-processus Python
Essayez d'utiliser Tweepy [Python2.7]
[Blender Python] Afficher les images sur la vue 3D en utilisant OpenGL (bgl)
Essayez d'afficher diverses informations utiles pour le débogage avec python
J'ai essayé de notifier les informations de retard de train avec LINE Notify
Exportez les informations produit au format CSV à l'aide de l'API de recherche de produits Rakuten [Python]