LoginSignup

Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

16
20

More than 3 years have passed since last update.

ใ€Pythonใ€‘็ฝฎใๆ™‚่จˆใฎ็”ป้ข่กจ็คบใจๆฉŸ่ƒฝใ‚’ๆ•ด็†ใ—ใฆใฟใŸ

Last updated at Posted at 2019-03-20

ๅ‰ๅ›žใฎ่จ˜ไบ‹๏ผšใ€Pythonใ€‘raspberry pi ็ฝฎใๆ™‚่จˆใซๅคฉๆฐ—ไบˆๅ ฑใ‚’่ฟฝๅŠ ใ—ใŸไปถ ใฎ็ถšใใงใ™ใ€‚

ๅคฉๆฐ—ไบˆๅ ฑใฎๆฌกใฏใ‚ปใƒณใ‚ตใƒผใ‚’ไฝฟใฃใฆใ€ๅฎŸ้š›ใฎๆฐ—ๆธฉใจๆธฉๅบฆใ‚’ๆธฌๅฎšใ—ใŸใ„ใจๆ€ใ„ใพใ™ใŒใ€
ใใฎๅ‰ใซๅข—ใˆใฆใใŸๆฉŸ่ƒฝใฎๆ•ด็†ใงใ™ใ€‚
ๅ‰ๅ›žใ‚ณใƒกใƒณใƒˆใงใ‚ขใƒ‰ใƒใ‚คใ‚นใ‚’ใ„ใŸใ ใใพใ—ใŸใฎใงใ€ๅ‹‰ๅผทใŒใฆใ‚‰ๆ•ด็†ใ—ใฆใฟใพใ—ใŸใ€‚่ฆ‹ใŸ็›ฎใ‚‚ๅฐ‘ใ—ๆ”นไฟฎใ—ใพใ—ใŸใ€‚

ๅ‹‰ๅผทใซใชใฃใŸใ“ใจ

  • ๆฉŸ่ƒฝ๏ผˆใƒ—ใƒญใ‚ฐใƒฉใƒ ใ‚ฝใƒผใ‚น๏ผ‰ใฎๅˆ†้›ข
  • ่จญๅฎšใƒ•ใ‚กใ‚คใƒซ
  • ใƒ•ใ‚ฉใƒณใƒˆใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซ

GitHub

็”ป้ข้…็ฝฎ

ใ“ใ‚“ใชๆ„Ÿใ˜ใง้…็ฝฎใ—ใพใ™ใ€‚
Screenshot_20190320.png

่งฃ่ชฌ

clock.py

ๆœฌๅฎถใƒ—ใƒญใ‚ฐใƒฉใƒ ใƒ•ใ‚กใ‚คใƒซใงใ—ใŸใŒใ€ๆ—ฅๆ™‚ใ‚’่กจ็คบใ™ใ‚‹ๆ™‚่จˆๆฉŸ่ƒฝใ ใ‘ใซใชใ‚Šใพใ—ใŸใ€‚
ๅ˜็‹ฌใงใฎ่ตทๅ‹• python clock.py ใŒๅฏ่ƒฝใงใ™ใ€‚

clock.py
from tkinter import Tk, Canvas, Label
from datetime import datetime

# ๅ“ไธŠๆ™‚่จˆใ‚ฏใƒฉใ‚น
class Clock(Canvas):
    # ใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟ
    def __init__(self, master):
        # ่ฆชใ‚ฏใƒฉใ‚นใฎใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟ
        super().__init__(master, bg="white")

        # ๆ™‚ๅˆป่กจ็คบ
        self.wt1=Label(self, bg="white", font=("DSEG7 Classic", 140, "bold"))
        self.wt1.grid(row=0, column=0, ipady=50, sticky="news")

        self.wt2=Label(self, bg="white", font=("DSEG7 Classic", 70, "bold"))
        self.wt2.grid(row=0, column=1, ipadx=5, sticky="news")

        # ๆ—ฅไป˜่กจ็คบ
        self.wd=Label(self, bg="white", font=("", 50, "bold"))
        self.wd.grid(row=1, column=0, columnspan=2, sticky="news")

    # ่กจ็คบใ‚’ๆ›ดๆ–ฐ
    def update(self):
        # ็พๅœจๆ—ฅๆ™‚ใ‚’่กจ็คบ
        now=datetime.now()
        self.wd.configure(text=now.strftime("%Y/%m/%d (%a.)"))
        self.wt1.configure(text=now.strftime("%H:%M"))
        self.wt2.configure(text=now.strftime("%S"))

        # 1็ง’ๅพŒใซๅ†่กจ็คบ
        self.master.after(1000, self.update)

# ๅ˜็‹ฌๅ‡ฆ็†ใฎๅ ดๅˆ
def main():
    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆไฝœๆˆ
    root=Tk()

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚ฟใ‚คใƒˆใƒซ
    root.title("Clock")

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚ตใ‚คใ‚บ
    root.geometry("1024x768")

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎๆœ€ๅคงๅŒ–
    root.attributes("-zoom", "1")

    # ๅธธใซๆœ€ๅ‰้ขใซ่กจ็คบ
    root.attributes("-topmost", True)

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎ่ƒŒๆ™ฏ่‰ฒ
    root.configure(bg="white")

    # Clock ใ‚ฏใƒฉใ‚นใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใ‚’็”Ÿๆˆ
    clock=Clock(root)

    # ็”ป้ขใซ้…็ฝฎ
    clock.pack(expand=1)

    # ๆ™‚่จˆ่กจ็คบใฎๆ›ดๆ–ฐใ‚’้–‹ๅง‹๏ผˆupdate ใƒกใ‚ฝใƒƒใƒ‰ๅ‘ผใณๅ‡บใ—๏ผ‰
    clock.update()

    # ใƒกใ‚คใƒณใƒซใƒผใƒ—
    root.mainloop()

# import clock ใซใ‚ˆใ‚‹ๅ‘ผใณๅ‡บใ—ใงใชใ‘ใ‚Œใฐๅ˜็‹ฌๅ‡ฆ็† main() ใ‚’ๅฎŸ่กŒ
if __name__ == "__main__":
    main()

ๆ™‚ๅˆ†ใจ็ง’ใ‚’ๅˆ†ใ‘ใฆ้…็ฝฎใ€ๆ™‚้–“ใฎใƒ•ใ‚ฉใƒณใƒˆใ‚’ใƒ‡ใ‚ธใ‚ฟใƒซๆ™‚่จˆใฃใฝใ„ใ‚‚ใฎใซๅค‰ใˆใพใ—ใŸใ€‚
ๅฎŒๆˆๅฝขใฏไธ€็•ชไธ‹ใฎๅ†™็œŸใ‚’ใ”่ฆงใใ ใ•ใ„ใ€‚

ใƒ•ใ‚ฉใƒณใƒˆใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซใฏๅ‰ฒใจ็ฐกๅ˜ใ€‚
ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใ—ใŸใƒ•ใ‚ฉใƒณใƒˆใƒ•ใ‚กใ‚คใƒซใ‚’ /usr/share/fonts ใ‚ใŸใ‚Šใซ้…็ฝฎใ™ใ‚‹ใ ใ‘ใงใ™ใ€‚
ไปŠๅ›žใฏ TrueType ใƒ•ใ‚ฉใƒณใƒˆใชใฎใง truetype ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช้…ไธ‹ใซ็ฝฎใใพใ—ใŸใ€‚

fc-cache ใงๅๆ˜ ใ€fc-list ใ‚’ grep ๆคœ็ดขใ—ใฆ็›ฎ็š„ใฎใƒ•ใ‚ฉใƒณใƒˆใŒ่ช่ญ˜ใ•ใ‚Œใฆใ„ใ‚Œใฐ OK ใงใ™ใ€‚
ใกใชใฟใซใ€ใ‚ขใƒณใ‚คใƒณใ‚นใƒˆใƒผใƒซใฏ rm -R ใงใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ”ใจๅ‰Š้™คใ—ใฆ fc-cache ใงๅ†ๅบฆๅๆ˜ ใ™ใ‚‹ใ ใ‘ใ€‚

$ scp -r ~/Downloads/fonts-DSEG_v045 pi@192.168.X.X:/home/pi/python
pi@192.168.X.X's password:

$ ssh pi@192.168.X.X
pi@192.168.X.X's password:

$ sudo cp -r ~/python/fonts-DSEG_v045 /usr/share/fonts/truetype/fonts-DSEG_v045
$ fc-cache
$ fc-list | grep "DSEG7 Classic:style=Bold"
/usr/share/fonts/truetype/fonts-DSEG_v045/DSEG7-Classic/DSEG7Classic-BoldItalic.ttf: DSEG7 Classic:style=Bold Italic
/usr/share/fonts/truetype/fonts-DSEG_v045/DSEG7-Classic/DSEG7Classic-Bold.woff:DSEG7 Classic:style=Bold
/usr/share/fonts/truetype/fonts-DSEG_v045/DSEG7-Classic/DSEG7Classic-BoldItalic.woff: DSEG7 Classic:style=Bold Italic
/usr/share/fonts/truetype/fonts-DSEG_v045/DSEG7-Classic/DSEG7Classic-Bold.ttf: DSEG7 Classic:style=Bold

โ†“ใ‚ขใƒณใ‚คใƒณใ‚นใƒˆใƒผใƒซๆ–นๆณ•
$ sudo rm -R /usr/share/fonts/truetype/fonts-DSEG_v045
$ fc-cache
$ fc-list | grep "DSEG14 Classic:style=Bold"

ใƒ•ใ‚ฉใƒณใƒˆใฏไปฅไธ‹ใฎใ‚ตใ‚คใƒˆใ‹ใ‚‰้ ‚ๆˆดใ—ใพใ—ใŸใ€‚
ๅ‚่€ƒใƒชใƒณใ‚ฏ๏ผš7ใ‚ปใ‚ฐใƒป14ใ‚ปใ‚ฐใƒ•ใ‚ฉใƒณใƒˆ ใ€ŒDSEGใ€

weather.py

ๅคฉๆฐ—ไบˆๅ ฑๆฉŸ่ƒฝใ‚’้›†็ด„ใ—ใฆใ„ใพใ™ใ€‚
ใ“ใกใ‚‰ใ‚‚ๅ˜็‹ฌใงใฎ่ตทๅ‹• python weather.py ใŒๅฏ่ƒฝใงใ™ใ€‚
OpenWeatherMap ใฎๆƒ…ๅ ฑใ‚’ใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰็›ดๆ›ธใใ‹ใ‚‰่จญๅฎšใƒ•ใ‚กใ‚คใƒซใซๅค–ๅ‡บใ—ใ€ใ‚ใจ้ขจๅ‘ใใจๅผทใ•ใ‚’ๆ–ฐใŸใซ่ฟฝๅŠ ใ—ใพใ—ใŸใ€‚

ใชใŠใ€้ขจๅ‘ใใฎ่กจ็คบๆ–นๆณ•ใซใคใ„ใฆใฏใ“ใกใ‚‰ใฎใ‚ตใ‚คใƒˆใŒๅ‚่€ƒใซใชใ‚Šใพใ—ใŸใ€‚
ๅ‚่€ƒใƒชใƒณใ‚ฏ๏ผšOpenWeatherMapใ‚’ใ‚ทใƒงใƒผใƒˆใ‚ณใƒผใƒ‰ใซใ—ใฆๅ„ๅœฐใฎๅคฉๆฐ—ใ‚’่กจ็คบ | ใ‚†ใ†ใใ†ใจITใƒ–ใƒญใ‚ฐ

โ˜…ใ‚ณใƒกใƒณใƒˆใ‚’ใ„ใŸใ ใใพใ—ใŸ

ใ—ใ‚‰ใ‹ใฟใ‚…ใ•ใ‚“ใ‹ใ‚‰ weather.py ใฎใƒ•ใƒฌใƒผใƒ ๅŒ–ใซใคใ„ใฆใ‚ณใƒกใƒณใƒˆใ‚’ใ„ใŸใ ใใพใ—ใŸใ€‚ใจใฆใ‚‚ๆด—็ทดใ•ใ‚Œใฆใพใ™ใญใ€‚
ไธ‹่จ˜ใฎใ‚ณใƒผใƒ‰ใฏๅˆๅฟƒ่€…ๅ‘ใ‘ใจใ„ใ†ใ“ใจใงใ”ๅฎน่ตฆใใ ใ•ใ„ใ€‚

weather.py
from tkinter import Tk, Frame, Label
from datetime import datetime
from PIL import Image, ImageTk
import configparser
import json
import math
import os
import requests
import sys

# ใ“ใฎใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎ็ตถๅฏพใƒ‘ใ‚น
scr_path = os.path.dirname(os.path.abspath(sys.argv[0]))

# ่จญๅฎšใƒ•ใ‚กใ‚คใƒซใ‹ใ‚‰ๅ–ๅพ—๏ผˆPython 3.X ็”จ๏ผ‰
inifile=configparser.ConfigParser()
inifile.read(scr_path + "/weather.ini", "UTF-8")

# OpenWeatherMap ใฎๆƒ…ๅ ฑ
KEY = inifile.get("settings", "key")
ZIP = inifile.get("settings", "zip")
URL = inifile.get("settings", "url")

# ๅคฉๆฐ—ไบˆๅ ฑใ‚ฏใƒฉใ‚น
class Weather(Frame):
    # ใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟ
    def __init__(self, master):
        # ่ฆชใ‚ฏใƒฉใ‚นใฎใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟ
        super().__init__(master, bd=0, bg="white", relief="flat")

        # ๅœฐๅŸŸ่กจ็คบ๏ผˆๅทฆๅฏ„ใ›๏ผ‰
        self.wp=Label(self, bg="white", fg="gray", font=("", 20, "bold"), anchor="w")
        self.wp.grid(row=0, column=0, columnspan=8, padx=20, sticky="news")

        # ๅคฉๅ€™ใ‚ขใ‚คใ‚ณใƒณ๏ผˆใƒ‡ใ‚ฃใ‚ฏใ‚ทใƒงใƒŠใƒชใƒผ๏ผ‰
        self.icon_dict={
            "01d":Image.open(scr_path + "/img/01d.png"), "01n":Image.open(scr_path + "/img/01n.png"),
            "02d":Image.open(scr_path + "/img/02d.png"), "02n":Image.open(scr_path + "/img/02n.png"),
            "03d":Image.open(scr_path + "/img/03.png"),  "03n":Image.open(scr_path + "/img/03.png"),
            "04d":Image.open(scr_path + "/img/04.png"),  "04n":Image.open(scr_path + "/img/04.png"),
            "09d":Image.open(scr_path + "/img/09.png"),  "09n":Image.open(scr_path + "/img/09.png"),
            "10d":Image.open(scr_path + "/img/10.png"),  "10n":Image.open(scr_path + "/img/10.png"),
            "11d":Image.open(scr_path + "/img/11.png"),  "11n":Image.open(scr_path + "/img/11.png"),
            "13d":Image.open(scr_path + "/img/13.png"),  "13n":Image.open(scr_path + "/img/13.png"),
            "50d":Image.open(scr_path + "/img/50.png"),  "50n":Image.open(scr_path + "/img/50.png")
        }

        # ใ‚ขใ‚คใ‚ณใƒณใ‚ตใ‚คใ‚บใ‚’็”ป้ขใ‚ตใ‚คใ‚บใซใƒ•ใ‚ฃใƒƒใƒˆ๏ผˆ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])

        # ๅคฉๆฐ—ไบˆๅ ฑ๏ผˆๆ™‚้–“ๅธฏ๏ผ‰
        self.wwl=[
            Label(self, text="0", bg="white", font=("", 30, "bold")),
            Label(self, text="0", bg="white", font=("", 30, "bold")),
            Label(self, text="0", bg="white", font=("", 30, "bold")),
            Label(self, text="0", bg="white", font=("", 30, "bold")),
            Label(self, text="0", bg="white", font=("", 30, "bold")),
            Label(self, text="0", bg="white", font=("", 30, "bold")),
            Label(self, text="0", bg="white", font=("", 30, "bold")),
            Label(self, text="0", bg="white", font=("", 30, "bold"))
        ]

        # ๅคฉๆฐ—ไบˆๅ ฑ๏ผˆๆ™‚้–“ๅธฏ๏ผ‰ใ‚’้…็ฝฎ
        for i in range(len(self.wwl)):
            self.wwl[i].grid(row=1, column=i, pady=5, sticky="news")

        # ๅคฉๆฐ—ไบˆๅ ฑ๏ผˆๅคฉๅ€™๏ผ‰
        self.wwi=[
            Label(self, image=self.icon_dict["01d"], bg="white"),
            Label(self, image=self.icon_dict["01d"], bg="white"),
            Label(self, image=self.icon_dict["01d"], bg="white"),
            Label(self, image=self.icon_dict["01d"], bg="white"),
            Label(self, image=self.icon_dict["01d"], bg="white"),
            Label(self, image=self.icon_dict["01d"], bg="white"),
            Label(self, image=self.icon_dict["01d"], bg="white"),
            Label(self, image=self.icon_dict["01d"], bg="white")
        ]

        # ๅคฉๆฐ—ไบˆๅ ฑ๏ผˆๅคฉๅ€™๏ผ‰ใ‚’้…็ฝฎ
        for i in range(len(self.wwi)):
            self.wwi[i].grid(row=2, column=i, pady=5, sticky="news")

        # ๅคฉๆฐ—ไบˆๅ ฑ๏ผˆๆฐ—ๆธฉ๏ผ‰
        self.wwt=[
            Label(self, text="๏ผยฐC", bg="white", font=("", 20)),
            Label(self, text="๏ผยฐC", bg="white", font=("", 20)),
            Label(self, text="๏ผยฐC", bg="white", font=("", 20)),
            Label(self, text="๏ผยฐC", bg="white", font=("", 20)),
            Label(self, text="๏ผยฐC", bg="white", font=("", 20)),
            Label(self, text="๏ผยฐC", bg="white", font=("", 20)),
            Label(self, text="๏ผยฐC", bg="white", font=("", 20)),
            Label(self, text="๏ผยฐC", bg="white", font=("", 20))
        ]

        # ๅคฉๆฐ—ไบˆๅ ฑ๏ผˆๆฐ—ๆธฉ๏ผ‰ใ‚’้…็ฝฎ
        for i in range(len(self.wwt)):
            self.wwt[i].grid(row=3, column=i, pady=5, sticky="news")

        # ๅคฉๆฐ—ไบˆๅ ฑ๏ผˆ้™ๆฐด้‡๏ผ‰
        self.wwr=[
            Label(self, text="๏ผmm", bg="white", font=("", 20)),
            Label(self, text="๏ผmm", bg="white", font=("", 20)),
            Label(self, text="๏ผmm", bg="white", font=("", 20)),
            Label(self, text="๏ผmm", bg="white", font=("", 20)),
            Label(self, text="๏ผmm", bg="white", font=("", 20)),
            Label(self, text="๏ผmm", bg="white", font=("", 20)),
            Label(self, text="๏ผmm", bg="white", font=("", 20)),
            Label(self, text="๏ผmm", bg="white", font=("", 20))
        ]

        # ๅคฉๆฐ—ไบˆๅ ฑ๏ผˆ้™ๆฐด้‡๏ผ‰ใ‚’้…็ฝฎ
        for i in range(len(self.wwr)):
            self.wwr[i].grid(row=4, column=i, pady=5, sticky="news")

        # ๅคฉๆฐ—ไบˆๅ ฑ๏ผˆ้ขจๅ‘ใ๏ผ‰
        self.www=[
            Label(self, text="๏ผ", bg="white", font=("", 20)),
            Label(self, text="๏ผ", bg="white", font=("", 20)),
            Label(self, text="๏ผ", bg="white", font=("", 20)),
            Label(self, text="๏ผ", bg="white", font=("", 20)),
            Label(self, text="๏ผ", bg="white", font=("", 20)),
            Label(self, text="๏ผ", bg="white", font=("", 20)),
            Label(self, text="๏ผ", bg="white", font=("", 20)),
            Label(self, text="๏ผ", bg="white", font=("", 20))
        ]

        # ๅคฉๆฐ—ไบˆๅ ฑ๏ผˆ้ขจๅ‘ใ๏ผ‰ใ‚’้…็ฝฎ
        for i in range(len(self.www)):
            self.www[i].grid(row=5, column=i, pady=5, sticky="news")

        # ใƒฌใ‚คใ‚ขใ‚ฆใƒˆ
        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)
        self.rowconfigure(5, weight=1)
        for i in range(len(self.wwl)):
            self.columnconfigure(i, weight=1)

    # ่กจ็คบใ‚’ๆ›ดๆ–ฐ
    def update(self):
        # ่กจ็คบใ‚ซใ‚ฆใƒณใ‚ฟ
        count=0

        # URL ใ‚’ไฝœๆˆใ—ใฆ OpenWeatherMap ใซๅ•ใ„ๅˆใ‚ใ›ใ‚’่กŒใ†
        url=URL.format(ZIP, KEY)
        response=requests.get(url)
        forecastData=json.loads(response.text)

        # ็ตๆžœใŒๅพ—ใ‚‰ใ‚Œใชใ„ๅ ดๅˆใฏใ‚จใƒฉใƒผ็ต‚ไบ†
        if not ("list" in forecastData):
            self.wp.configure(text="OpenWeatherMap request error!", fg="red")
            return

        # ใƒ‡ใƒใƒƒใ‚ฐ็”จ
        print(forecastData)

        # ็ตๆžœใ‚’ 3 ๆ™‚้–“ๅ˜ไฝใงๅ–ๅพ—
        for item in forecastData["list"]:
            # ๆ™‚้–“ๅธฏใ‚’ 24 ๆ™‚้–“่กจ่จ˜ใง่กจ็คบ
            forecastDatetime = datetime.fromtimestamp(item["dt"])
            self.wwl[count].configure(text=forecastDatetime.hour)

            # ๆฐ—ๅ€™ใ‚’ใ‚ขใ‚คใ‚ณใƒณใง่กจ็คบ
            self.wwi[count].configure(image=self.icon_dict[item["weather"][0]["icon"]])

            # ๆฐ—ๆธฉใ‚’่กจ็คบ
            self.wwt[count].configure(text="{0}ยฐc".format(round(item["main"]["temp"])))

            # ้™ๆฐด้‡ใ‚’่กจ็คบ
            rainfall = 0
            if "rain" in item and "3h" in item["rain"]:
                rainfall = item["rain"]["3h"]
            self.wwr[count].configure(text="{0}mm".format(math.ceil(rainfall)))

            # ้ขจๅ‘ใใ‚’่กจ็คบ
            windspd=item["wind"]["speed"]
            winddeg=item["wind"]["deg"]

            # ้ขจใฎๆ–น่ง’ใ‚’ๅ‰ฒใ‚Šๅ‡บใ™
            if winddeg < 22.5:
                # ๅŒ—ๆ—‹ๅ›ž
                winddeg += 360

            if winddeg > 337.5 and winddeg < 382.5:
                # ๅŒ—ใฎ้ขจ
                self.www[count].configure(text="N, {0}m".format(math.ceil(windspd)))
            elif winddeg > 22.5 and winddeg < 67.5:
                # ๅŒ—ๆฑใฎ้ขจ
                self.www[count].configure(text="NE, {0}m".format(math.ceil(windspd)))
            elif winddeg > 67.5 and winddeg < 112.5:
                # ๆฑใฎ้ขจ
                self.www[count].configure(text="E, {0}m".format(math.ceil(windspd)))
            elif winddeg > 112.5 and winddeg < 157.5:
                # ๅ—ๆฑใฎ้ขจ
                self.www[count].configure(text="SE, {0}m".format(math.ceil(windspd)))
            elif winddeg > 157.5 and winddeg < 202.5:
                # ๅ—ใฎ้ขจ
                self.www[count].configure(text="S, {0}m".format(math.ceil(windspd)))
            elif winddeg > 202.5 and winddeg < 247.5:
                # ๅ—่ฅฟใฎ้ขจ
                self.www[count].configure(text="SW, {0}m".format(math.ceil(windspd)))
            elif winddeg > 247.5 and winddeg < 292.5:
                # ่ฅฟใฎ้ขจ
                self.www[count].configure(text="W, {0}m".format(math.ceil(windspd)))
            elif winddeg > 292.5 and winddeg < 337.5:
                # ๅŒ—่ฅฟใฎ้ขจ
                self.www[count].configure(text="NW, {0}m".format(math.ceil(windspd)))

            # ่กจ็คบใ‚ซใ‚ฆใƒณใ‚ฟใ‚’ๆ›ดๆ–ฐ
            count += 1

            # ๅ…จใฆ่กจ็คบใ—็ต‚ใˆใŸใ‚‰ใƒซใƒผใƒ—็ต‚ไบ†
            if count >= len(self.wwl):
                # ๅœฐๅŸŸๆƒ…ๅ ฑใ‚’่กจ็คบ
                self.wp.configure(text="{0}, {1} (lat:{2}, lon:{3})".format(
                    forecastData["city"]["country"],
                    forecastData["city"]["name"],
                    forecastData["city"]["coord"]["lat"],
                    forecastData["city"]["coord"]["lon"]), fg="gray")

                # 60็ง’ๅพŒใซๅ†่กจ็คบ
                self.master.after(60000, self.update)
                return

# ๅ˜็‹ฌๅ‡ฆ็†ใฎๅ ดๅˆ
def main():
    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆไฝœๆˆ
    root=Tk()

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚ฟใ‚คใƒˆใƒซ
    root.title("Weather")

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚ตใ‚คใ‚บ
    root.geometry("1024x768")

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎๆœ€ๅคงๅŒ–
    root.attributes("-zoom", "1")

    # ๅธธใซๆœ€ๅ‰้ขใซ่กจ็คบ
    root.attributes("-topmost", True)

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎ่ƒŒๆ™ฏ่‰ฒ
    root.configure(bg="white")

    # Weather ใ‚ฏใƒฉใ‚นใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใ‚’็”Ÿๆˆ
    weather=Weather(root)

    # ็”ป้ขไธญๅคฎใซ้…็ฝฎ
    weather.pack(expand=1, fill="x")

    # ๅคฉๆฐ—ไบˆๅ ฑใฎๆ›ดๆ–ฐใ‚’้–‹ๅง‹๏ผˆupdate ใƒกใ‚ฝใƒƒใƒ‰ๅ‘ผใณๅ‡บใ—๏ผ‰
    weather.update()

    # ใƒกใ‚คใƒณใƒซใƒผใƒ—
    root.mainloop()

# import weather ใซใ‚ˆใ‚‹ๅ‘ผใณๅ‡บใ—ใงใชใ‘ใ‚Œใฐๅ˜็‹ฌๅ‡ฆ็† main() ใ‚’ๅฎŸ่กŒ
if __name__ == "__main__":
    main()

ใงใ€่จญๅฎšใƒ•ใ‚กใ‚คใƒซใฏใ“ใกใ‚‰ใ€‚
ใ“ใ‚Œใงใ„ใกใ„ใกใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ใ‚’ๆ›ธใๆ›ใˆใšใซๆธˆใฟใพใ™ใ€‚
๏ผˆ่จญๅฎšใƒ•ใ‚กใ‚คใƒซใŒใชใ„ใจๅฎŸ่กŒๆ™‚ใ‚จใƒฉใƒผใซใชใ‚Šใพใ™๏ผ‰

weather.ini
[settings]
key = ********************************
zip = 101-0032,JP
url = http://api.openweathermap.org/data/2.5/forecast?zip={0}&units=metric&lang=ja&APPID={1}

main.py

ใใ‚Œใžใ‚ŒใฎๆฉŸ่ƒฝใ‚’ๅฎŸ่กŒใ—ใฆใ€็ตๆžœใ‚’็”ป้ขใซ่กจ็คบใ™ใ‚‹ใƒกใ‚คใƒณใƒ•ใƒฌใƒผใƒ ใงใ™ใ€‚
ๆ™‚่จˆใ€ๅคฉๆฐ—ไบˆๅ ฑใ€ใ“ใฎใ‚ใจๅฎŸ่ฃ…ใ™ใ‚‹ไบˆๅฎšใฎใ‚ปใƒณใ‚ตใƒผๆƒ…ๅ ฑใ‚’่กจ็คบใ—ใพใ™ใ€‚

main.py
from tkinter import *
import tkinter.ttk as ttk
from clock import Clock
from sensor import Sensor
from weather import Weather

# MainFrame ใ‚ฏใƒฉใ‚น
class MainFrame(ttk.Frame):
    # ใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟ
    def __init__(self, master=None, *args, **kwargs):
        # ่ฆชใ‚ฏใƒฉใ‚นใฎใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟ
        super().__init__(args, **kwargs)

        # Clock ใ‚ฏใƒฉใ‚นใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใ‚’็”Ÿๆˆใ—ใฆ้…็ฝฎ
        self.clock=Clock(self)
        self.clock.grid(row=0, column=0, sticky="news")

        # Sensor ใ‚ฏใƒฉใ‚นใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใ‚’็”Ÿๆˆใ—ใฆ้…็ฝฎ
        self.sensor=Sensor(self)
        self.sensor.grid(row=0, column=1, sticky="news")

        # Weather ใ‚ฏใƒฉใ‚นใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใ‚’็”Ÿๆˆใ—ใฆ้…็ฝฎ
        self.weather=Weather(self)
        self.weather.grid(row=1, column=0, columnspan=2, sticky="news")

        # ใƒฌใ‚คใ‚ขใ‚ฆใƒˆ
        self.columnconfigure(1, weight=1)

    def update(self):
        # ๆ™‚่จˆ่กจ็คบใฎๆ›ดๆ–ฐใ‚’้–‹ๅง‹๏ผˆClock.update ใƒกใ‚ฝใƒƒใƒ‰ๅ‘ผใณๅ‡บใ—๏ผ‰
        self.clock.update()

        # ใ‚ปใƒณใ‚ตใƒผ่กจ็คบใฎๆ›ดๆ–ฐใ‚’้–‹ๅง‹๏ผˆSensor.update ใƒกใ‚ฝใƒƒใƒ‰ๅ‘ผใณๅ‡บใ—๏ผ‰
        self.sensor.update()

        # ๅคฉๆฐ—ไบˆๅ ฑใฎๆ›ดๆ–ฐใ‚’้–‹ๅง‹๏ผˆWeather.update ใƒกใ‚ฝใƒƒใƒ‰ๅ‘ผใณๅ‡บใ—๏ผ‰
        self.weather.update()

# ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆไฝœๆˆ
root=Tk()

# ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚ฟใ‚คใƒˆใƒซ
root.title("Main")

# ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚ตใ‚คใ‚บ
root.geometry("1024x768")

# ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎๆœ€ๅคงๅŒ–
#root.attributes("-zoom", "1")
root.attributes("-fullscreen", "1")

# ๅธธใซๆœ€ๅ‰้ขใซ่กจ็คบ
root.attributes("-topmost", True)

# ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎ่ƒŒๆ™ฏ่‰ฒ
root.configure(bg="white")

# ใƒกใ‚คใƒณใƒ•ใƒฌใƒผใƒ ใ‚’้…็ฝฎ
app=MainFrame(root)

# ็”ป้ขใซ้…็ฝฎ
app.pack(fill="both")

# ้–‰ใ˜ใ‚‹ใƒœใ‚ฟใƒณไฝœๆˆ
close=Button(root, text=" X ", font=('', 16, "bold"), relief=FLAT, command=root.destroy)

# ็”ป้ขใŒใƒชใ‚ตใ‚คใ‚บใ•ใ‚ŒใŸใจใใ€ใƒœใ‚ฟใƒณใฎไฝ็ฝฎใ‚’ๅณไธŠใซ็งปๅ‹•
def change_size(event):
    close.place(x=root.winfo_width() - 60, y=14)

# ็”ป้ขใฎใƒชใ‚ตใ‚คใ‚บใ‚’ใƒใ‚คใƒณใƒ‰ใ™ใ‚‹
root.bind('<Configure>', change_size)

# MainFrame.update ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ™
app.update()

# ใƒกใ‚คใƒณใƒซใƒผใƒ—
root.mainloop()

sensor.py

ๆธฉๅบฆใ€ๆนฟๅบฆใ€ใ‚ใจใคใ„ใงใซๅคงๆฐ—ๅœงใ‚ปใƒณใ‚ตใƒผใŒใ‚ใฃใŸใฎใง็ต„ใฟ่พผใ‚“ใงใฟใ‚‹ไบˆๅฎšใงใ™ใ€‚
ใจใ‚Šใ‚ใˆใšใƒฉใƒ™ใƒซ่กจ็คบใ ใ‘ใ—ใฆใฟใพใ—ใŸใ€‚
ใ“ใกใ‚‰ใ‚‚ๅ˜็‹ฌใงใฎ่ตทๅ‹• python sensor.py ใŒๅฏ่ƒฝใงใ™ใ€‚

sensor.py
from tkinter import Tk, Frame, Label

# ใ‚ปใƒณใ‚ตใƒผ่กจ็คบใ‚ฏใƒฉใ‚น
class Sensor(Frame):
    # ใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟ
    def __init__(self, master):
        # ่ฆชใ‚ฏใƒฉใ‚นใฎใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟ
        super().__init__(master, bg="white")

        # ใ‚นใƒšใƒผใ‚ต๏ผˆใ‚ปใƒณใ‚ตใƒผ่กจ็คบไธŠ้ƒจใฎ้–“้š”่ชฟๆ•ด๏ผ‰
        self.wsp=Label(self, bg="white")
        self.wsp.grid(row=0, column=0, ipady=84, sticky="news")

        # ๆธฉๅบฆ่กจ็คบ
        self.wst1=Label(self, text="ๆฐ—ๆธฉ๏ผš", bg="white", font=("", 20, "bold"))
        self.wst1.grid(row=1, column=0, pady=5, sticky="news")

        self.wst2=Label(self, text="0ยฐc", bg="lightblue", font=("", 30, "bold"))
        self.wst2.grid(row=1, column=1, ipadx=5, pady=5, sticky="news")

        # ๆนฟๅบฆ่กจ็คบ
        self.wsh1=Label(self, text="ๆนฟๅบฆ๏ผš", bg="white", font=("", 20, "bold"))
        self.wsh1.grid(row=2, column=0, pady=5, sticky="news")

        self.wsh2=Label(self, text="0%", bg="silver", font=("", 30, "bold"))
        self.wsh2.grid(row=2, column=1, ipadx=5, pady=5, sticky="news")

        # ๆฐ—ๅœง่กจ็คบ
        self.wsp1=Label(self, text="ๆฐ—ๅœง๏ผš1013", bg="white", font=("", 20, "bold"))
        self.wsp1.grid(row=3, column=0, columnspan=2, pady=5, sticky="news")

    # ่กจ็คบใ‚’ๆ›ดๆ–ฐ
    def update(self):
        # 1็ง’ๅพŒใซๅ†่กจ็คบ
        self.master.after(1000, self.update)

# ๅ˜็‹ฌๅ‡ฆ็†ใฎๅ ดๅˆ
def main():
    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆไฝœๆˆ
    root=Tk()

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚ฟใ‚คใƒˆใƒซ
    root.title("Sensor")

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚ตใ‚คใ‚บ
    root.geometry("1024x768")

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎๆœ€ๅคงๅŒ–
    root.attributes("-zoom", "1")

    # ๅธธใซๆœ€ๅ‰้ขใซ่กจ็คบ
    root.attributes("-topmost", True)

    # ใƒกใ‚คใƒณใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎ่ƒŒๆ™ฏ่‰ฒ
    root.configure(bg="white")

    # Sensor ใ‚ฏใƒฉใ‚นใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใ‚’็”Ÿๆˆ
    sensor=Sensor(root)

    # ็”ป้ขใซ้…็ฝฎ
    sensor.pack(expand=1, fill="y")

    # ใ‚ปใƒณใ‚ตใƒผ่กจ็คบใฎๆ›ดๆ–ฐใ‚’้–‹ๅง‹๏ผˆupdate ใƒกใ‚ฝใƒƒใƒ‰ๅ‘ผใณๅ‡บใ—๏ผ‰
    sensor.update()

    # ใƒกใ‚คใƒณใƒซใƒผใƒ—
    root.mainloop()

# import sensor ใซใ‚ˆใ‚‹ๅ‘ผใณๅ‡บใ—ใงใชใ‘ใ‚Œใฐๅ˜็‹ฌๅ‡ฆ็† main() ใ‚’ๅฎŸ่กŒ
if __name__ == "__main__":
    main()

ๅฎŒๆˆ๏ผˆใจใ‚Šใ‚ใˆใš็”ป้ข่กจ็คบใ ใ‘๏ผ‰

IMG_20190320_211945.jpg

16
20
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Comments

No comments

Let's comment your feelings that are more than good

16
20

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address