2017-03-05 5 views
3

나는 시계가 작동하도록 노력하고 있습니다. 나는 600x600 형태를 사용하고있다. 폼의 중심에 타원을 배치하는 방법이나 타원 내부에 분 또는 초 눈금을 추가하는 방법을 이해할 수 없습니다. 나는 돌진을 시도했지만 올바르게 보일 수 없었다. 어떤 제안. 미리 감사드립니다.파이썬 3 Tkinter 캔버스

이것은 내가 지금까지 무엇을했는지 있습니다 :

from tkinter import * 

canvas_width = 600 
canvas_height = 600 

master = Tk() 

w = Canvas(master, width = canvas_width, height = canvas_height) 

w.pack() 

oval = w.create_oval(75,75,500,500) 
minline = w.create_line(150,150,300,300) 

mainloop() 

답변

5

그려진 모양의 중심이 그릴 때 지정된 두 점의 중간이다. 현재 도형 중간 점 (75, 75에서 500, 500까지)은 237.5이므로 중간을 페이지 중앙에두고 싶고 75, 75 좌표를 유지하려면 다른 쪽을 만들어야합니다. 525, 525 첫 번째를 완전히 비추는 것.

모양을 그리는 데는 파이썬에서 math이 필요합니다. 그래서 먼저 이미지를 시계의 배경으로 사용하여 적은 수의 객체를 그릴 것을 제안합니다. 그러나 다른 이미지없이이 작업을 수행해야하는 경우 먼저 수학 라이브러리를 가져와야합니다.

import math 

이제, 수학 원칙 : r 반경의 원호상의 임의의 지점은 θ이 점에 중심으로부터 각도 (r*cosθ), (r*sinθ) 점으로 나타낼 수있다. 이것이 중요한 이유는 시계면의 각 선이 원의 중심을 향하도록하기 위함입니다. 그렇게하기 위해서 우리는 그 중심에 선을 그리기 위해 두 점이 필요합니다. 그리고 다행히 우리에게 이것은 선의 두 점이 서로 다른 원 (우리 원과 그 안에있는 원)에 있지만 같은 위치에 있음을 의미합니다 중심으로부터의 각도.

우리는 서클 주위에 12 시간 지점과 각 지점 사이에 4 분의 지점 (총 60 포인트)과 원으로 360도 (6도마다 1 포인트)가 필요하기 때문에 for 루프는 그것을 통과합니다. (에 추가 할 분 포인트) 내부 원에 대해, 하나를 (에서 시작하는 점에 대한) 외부 원의 반경 하나, 그리고 하나 :

for angle in range(0, 360, 6): 

그리고 우리는 3 개 상수를 할 것입니다 더 많은 내부 순환계 (시간 지점이 끝나는 지점). 우리는 또한 내부 반경을 매 30도마다 선택하기를 원할 것입니다 (5 점마다 나타나고 그 사이에 6 도가 있기 때문에).

radius_out = 225 
    radius_in = 0 #temporary value 

    if (angle % 30) == 0: #the % symbol checks for remainder 

     radius_in = 210 

    else: 

     radius_in = 220 

이제 (파이썬 요구의 죄를 라디안 및 CoS에서 수학으로) 라디안으로 변환 :

radians = (angle/180) * math.pi 

다음으로 떨어져, 그것은 쉽게 읽을 수 그래서 변수에 좌표를 할당.

마지막으로 필요하면 나중에 액세스 할 수 있도록 목록에 지정합니다. 이 목록을 for 루프 외부에서 먼저 정의해야합니다.

 coords.append(w.create_line(x_out, y_out, x_in, y_in)) 

이것은 시계 라인을 제공합니다.

참고 : tkinter가 x 좌표와 y 좌표를 지정하는 방식으로 인해 시계 방향으로 3 줄의 선이 다시 그려집니다.

희망이있었습니다. 당신이 이해할 수없는 것이 있다면, 아래에 주석으로 적어주십시오.