Chamelion
@Chamelion (リオン カメ)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

計算の解説お願いします

解決したいこと

時計を作るプログラムで「文字盤の描画」の部分

        self.font_size = int(self.size/15)
        for number in range(1,12+1):
            x = self.size/2 + math.cos(math.radians(number*360/ 12 - 90))*self.size/2*0.85
            y = self.size/2 + math.sin(math.radians(number*360/ 12 - 90))*self.size/2*0.85
            self.clock.create_text(x,y,text=str(number),  fill="black", font =("",14))

のどう計算してるかわからないので、解説お願いします。
何か関係してるか分からないので一応全コード載せました。

該当するソースコード

# #␣tkinter␣canvas␣を使ったアナログ時計,ボタンなし #
import tkinter as tk
import math
import time
#
#␣Frame␣を拡張したクラス
#
class MyFrame(tk.Frame):
    def __init__(self, master = None):
        super().__init__(master)
#
# キャンバスの作成
#
        self.size = 200
        self.clock = tk.Canvas(self, width=self.size,  height=self.size, background="white")
        self.clock.grid(row=0, column=0)
#
# 文字盤の描画
#
        self.font_size = int(self.size/15)
        for number in range(1,12+1):
            x = self.size/2 + math.cos(math.radians(number*360/ 12 - 90))*self.size/2*0.85
            y = self.size/2 + math.sin(math.radians(number*360/ 12 - 90))*self.size/2*0.85
            self.clock.create_text(x,y,text=str(number),  fill="black", font =("",14))
#
# 時刻の経過確認などの動作のためのインスタンス変数
#
        self.sec = time.localtime().tm_sec
        self.min = time.localtime().tm_min
        self.hour = time.localtime().tm_hour
    #
    # 変化する画面の描画
    #
    def display(self):
        #
        # 秒針の描画
        #
        self.sec = time.localtime().tm_sec
        angle = math.radians(self.sec*360/60 - 90)
        x0 = self.size/2 - math.cos(angle)*self.size/2*0.1
        y0 = self.size/2 - math.sin(angle)*self.size/2*0.1
        x = self.size/2 + math.cos(angle)*self.size/2*0.75
        y = self.size/2 + math.sin(angle)*self.size/2*0.75
        #
        # 前の描画をタグで検索して消してから描画
        #
        self.clock.delete("SEC")
        self.clock.create_line(x0,y0,x,y, width=1, fill="red", tag="SEC")
        #
        # 分針,時針の描画,1分毎,時針は分まで考慮
        #
        x0 = self.size/2
        y0 = self.size/2
        self.min = time.localtime().tm_min
        angle = math.radians(self.min*360/60 - 90)
        x = self.size/2 + math.cos(angle)*self.size/2*0.65
        y = self.size/2 + math.sin(angle)*self.size/2*0.65
        self.clock.delete("MIN")
        self.clock.create_line(x0,y0,x,y, width=3, fill="blue", tag="MIN")

        self.hour = time.localtime().tm_hour
        x0 = self.size/2
        y0 = self.size/2
        angle = math.radians((self.hour%12+self.min/60)*360/12 - 90)
        x = self.size/2 + math.cos(angle)*self.size/2*0.55
        y = self.size/2 + math.sin(angle)*self.size/2*0.55
        self.clock.delete("HOUR")
        self.clock.create_line(x0,y0,x,y, width=3, fill="green", tag="HOUR")
        #
        # 日付の描画,␣秒が変わるか,ボタンが押されたとき
        #
        x = self.size/2
        y = self.size/2 + 20
        text = time.strftime('%Y/%m/%d %H:%M:%S')
        self.clock.delete("TIME")
        self.clock.create_text(x, y, text=text, font=("",12), fill="black", tag="TIME")
        #
        # 100␣ミリ秒後に再度呼び出す
        # 
        self.after(100, self.display)

root = tk.Tk()
f = MyFrame(root)
f.pack()
f.display()
root.mainloop()
0

1Answer

こちらの図でわからないことがあれば、コメントください。

mojiban.png

ただし、プログラムではmath.cosおよびmath.sinは弧度法の角度を引数にとるため、math.radiansで度数法から弧度法に変換しています。

0Like

Comments

  1. @Chamelion

    Questioner

    解りやすい解説ありがとうございます。
    おかげ様でしっかり理解することが出来ました。
  2. お力添えできたようで何よりです。
    引き続きがんばってください!

Your answer might help someone💌