Всем привет! Сегодня я расскажу как создать аналоговые часы на Python 3.0 и вывести их с помощью tkinter.
Сначала разберем самое интересное.
подключаем модули math (для вычислений) и time (для получения значений часов минут и секунд на вашем компьютере).
# -*- coding:utf-8 -*- import math #подключаем модуль math import time #подключаем модуль для определения времени и работы со временемПодключаем графическую библиотеку tkinter и инициализируем окно:
from tkinter import * #подключаем графическую библиотеку tkinter root = Tk()Создаем холст размером 500 на 500 пикселей и размещаем его в окне
canvas = Canvas(root, width = 500, height = 550) #инициализация холста 500х500 canvas.pack()#размещаем холст в нашем окне
Теперь нарисуем просто круг - будущий циферблат
canvas.create_oval(10, 10, 490, 490, fill = "lightblue") #циферблат просто круг
#вывод текста "cделано на Python" canvas.create_text(250, 350, text = 'сделано на Python', font = ('Arial', 8)) #выводим точку - центр циферблата, чтобы было куда стрелки крепить canvas.create_text(250, 225, text = '.', font = ("Arial", 62))Теперь зададим счетчик цикла i и выведем рисочки секунд и часов
i = 0 #счетчик цикла while i < 60: #цикл вывода секундных рисочек i = i + 1 canvas.create_line(250 + 210 * math.cos(-i * 6 * math.pi/180 + math.pi/2), 250 - 210 * math.sin(-6 * i * math.pi/180 + math.pi/2), 250 + 190 * math.cos(-6 * i * math.pi/180 + math.pi/2), 250 - 190 * math.sin(-6 * i * math.pi/180 + math.pi/2), width = 2) if i % 5 == 0: #когда i кратно 5 выводим более жирную рисочку для обозначения часов canvas.create_line(250 + 215 * math.cos(-i * 6 * math.pi/180 + math.pi/2), 250 - 215 * math.sin(-6 * i * math.pi/180 + math.pi/2), 250 + 190 * math.cos(-6 * i * math.pi/180 + math.pi/2), 250 - 190 * math.sin(-6 * i * math.pi/180 + math.pi/2), width = 4) continueВыведем цифры:
i = 0 while i < 12: #цикл вывода цифр часов i += 1 canvas.create_text(250 + 225 * math.cos(-i * 30 * math.pi/180 + math.pi/2), 250 - 225 * math.sin(-30 * i * math.pi/180 + math.pi/2), text = i, font = ('Arial' ,16))Далее создаем бесконечный цикл, получаем значение текущего времени выводим стрелки бегущую строку и т.д. все понятно из коментариев в коде:
i = 950 #счетчик цикла и координата х для вывода текста бегущей строки while 1: #основной бесконечный цикл time_now = time.localtime()#получаем текущее время в виде #time.struct_time(tm_year=2016, tm_mon=3, tm_mday=27, tm_hour=22, #tm_min=23, tm_sec=35, tm_wday=6, tm_yday=87, tm_isdst=0) time_sec = int(time.strftime("%S", time_now)) #получаем секунды из переменной time_now time_hour = int(time.strftime("%I", time_now)) #получаем часы из переменной time_now time_min = int(time.strftime("%M", time_now)) #получаем минуты из переменной time_now sec_angle = 6 * time_sec #угол отклонения секундной стрелки за 1 секунду min_angle = time_min * 6 + time_sec * 0.1 #угол отклонения минутной стрелки за 1 секунду #угол отклонения часовой стрелки за 1 секунду hour_angle = time_hour * 30 + time_min * 60 * (30/3600) #рисуем минутную стрелку line_min = canvas.create_line(250, 250, 250 - 180 * math.cos(min_angle * math.pi/180 + math.pi/2), 250 - 180 * math.sin(min_angle * math.pi/180 + math.pi/2), width = 3, fill = 'darkblue') #рисуем часовую стрелку line_hour = canvas.create_line(250, 250, 250 - 150 * math.cos(hour_angle * math.pi/180 + math.pi/2), 250 - 150 * math.sin(hour_angle * math.pi/180 + math.pi/2), width = 5, fill = 'darkblue') #рисуем секундную стрелку line_sec = canvas.create_line(250, 250, 250 - 180 * math.cos(sec_angle * math.pi/180 + math.pi/2), 250 - 180 * math.sin(sec_angle * math.pi/180 + math.pi/2), width =2, fill = 'red') #Задаем бегущую строку text_bottom = canvas.create_text(i, 525, text = 'Хочешь научиться программировать на Python?'+ 'Узнай все подробности на http://pro365.net', font = ('Arial',16)) i = i - 0.5 if i == -600: i = 950 root.update()#обновляем экран/холст canvas.delete(line_sec) #удаляем секундную стрелку canvas.delete(line_min) #удаляем минутную стрелку canvas.delete(line_hour) #удаляем часовую стрелку canvas.delete(text_bottom) #удаляем строку внизу root.mainloop #создаем постоянный циклФайл скрипта можно скачать по ссылке и запускать на Python 3:
https://drive.google.com/file/d/0Bzi-qFYpx9H1VjhXdG5FYnFxZjQ/view?usp=drivesdk&resourcekey=0-YqyP_ZGDwF360fGSdIVrlQ
Далее для тех кто хочет разобраться немного математики.
Чтобы создать аналоговые часы в любом языке программирования нужно немного математики
Рассчитаем на какой угол повернуться секундная, часовая и минутная стрелки за одну секунду:
Секундная повернется на угол 360 °/60 = 6 °, т.к. вся окружность 360 ° и всего по ней распределены 60 секунд.
Минутная стрелка за это время повернется на 1/60 минуты т.е. расстояние от одной рисочки минут до другой разделится на 60 частей и каждую секунду минутная стрелка будет проходить одну часть которая рассчитывается так: (1/60) * (360 °/60) = 0,1 °.
Часы на циферблате располагаются через каждые 30 °. Расстояние (значение угла) от одного часа до следующего поделится на 3600 частей потомучто в часе 3600 секунд. Значит часовая стрелка за 1 секунду будет перемещаться на 1/3600 секунды или 1/60 минуты (т.к. один час равен 60 мин.) и расстояние между рисочками от одного часа до другого равно 5 рисочкам минут. Таким образом угол на который повернется часовая стрелка за секунду будет равен
30 °/3600 = 0,0083(3).
30 °/3600 = 0,0083(3).
Опираясь на рассуждения выше запишем формулы расчета углов поворота для каждой стрелки мы можем написать формулы для отсчета углов:
#угол отклонения секундной стрелки за 1 секунду sec_angle = 6 * time_sec #угол отклонения минутной стрелки за 1 секунду min_angle = time_min * 6 + time_sec * 0.1 #угол отклонения часовой стрелки за 1 секунду hour_angle = time_hour * 30 + time_min * 60 * (30/3600)
как можно заметить секундная стрелка будет двигаться рывками (дискретно) как в кварцевых часах,
а остальные стрелки двигаются плавно.
Описание переменных:
Стрелки часов выходят из центра. Для отрисовки стрелок нужно создать линию один конец которой известен (условный центр - допустим x и y) , для определения координат второго конца потребуются тригонометрические формулы. Координаты любой стрелки могут быть описаны следующим образом
начало - (x, y), конец - (x - x1 * cos(angle * П/180 + П/2), y - y1 * sin (angle * П/180 + П/2) ).
Вместо angle подставляем sec_angle если стрелка секундная и т.д. Умножение на П/180 нужно для того чтобы перевести градусы в радианы, + П/2 нужно для того чтобы начало отсчета было от 12 часов.
Формулы для всех стрелок будут выглядеть так:
#рисуем минутную стрелку line_min = canvas.create_line(250, 250, 250 - 180 * math.cos(min_angle * math.pi/180 + math.pi/2), 250 - 180 * math.sin(min_angle * math.pi/180 + math.pi/2), width = 3, fill = 'darkblue') #рисуем часовую стрелку line_hour = canvas.create_line(250, 250, 250 - 150 * math.cos(hour_angle * math.pi/180 + math.pi/2), 250 - 150 * math.sin(hour_angle * math.pi/180 + math.pi/2), width = 5, fill = 'darkblue') #рисуем секундную стрелку line_sec = canvas.create_line(250, 250, 250 - 180 * math.cos(sec_angle * math.pi/180 + math.pi/2), 250 - 180 * math.sin(sec_angle * math.pi/180 + math.pi/2), width =2, fill = 'red')На этом все если есть вопросы задавайте в комментариях.
хуйня
ОтветитьУдалитьдобрый день! будьте добры,аргументируйте ваш вопль пожалуйста :)
Удалитькрасава , ответочка супер
УдалитьЭтот комментарий был удален администратором блога.
УдалитьЭтот комментарий был удален администратором блога.
УдалитьВ Pascal эта программа выглядит короче и проще, по моему.
ОтветитьУдалитьSoory! Часы с секундной стрелкой написать в паскале будут иметь более короткий код.
ОтветитьУдалитьUnknown просто хамит. Не даром имя такое избрал!
ОтветитьУдалитьМатериал интересен, спасибо!
А вот мой: http://ite.kspu.edu/webfm_send/1073
Желаю успеха блогеру!
Благодарю)
ОтветитьУдалитья начинающий, и хотелось бы побольше готовых и так хорошо описанных примеров.
вместо вайла лучше пользоваться фором это раз. А во вторых: зачем реклама!?
ОтветитьУдалитьИдея хорошая, но код нужно доработать... Напрмер с бесконечным циклом Вы навертели непонять чего. Зачем столько i? Там они вообще не нужны ;)
ОтветитьУдалитьэто писал начинающий, движимый одним желанием написать что нибудь необычное и чтобы было весело. своей цели я добился :)
УдалитьИдея хорошая. У меня несколько комплектов циферблатов и стрелок красивых. ХОЧУ: 1. Сделать часы с циферблатом и стрелками в png формате. 2, Чтобы каждый день циферблат и стрелки по кругу менялись. Благодарствую заранее
ОтветитьУдалить