婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > pygame實現時鐘效果

pygame實現時鐘效果

熱門標簽:大連crm外呼系統 百度地圖標注位置怎么修改 梅州外呼業務系統 地圖標注視頻廣告 無錫客服外呼系統一般多少錢 高德地圖標注是免費的嗎 北京電信外呼系統靠譜嗎 老人電話機器人 洪澤縣地圖標注

用pygame做一個時鐘,供大家參考,具體內容如下

剛剛學習pygame,由于基礎實在太差,每個例子都要反復寫逐句研究才能基本弄懂,這次做一個簡單的有時針、分針、秒針,能正確行走的表。。。例子不難,但是還是能掌握一些基本的知識點,比如xy坐標的計算,畫圓,文字處理等。小白如我可以借鑒下,我認為學習還是以邏輯為主,所以我盡量還原初學時候的邏輯步驟,不啰嗦了,開整!

前期準備

這次我們用到的主要是pygame,math,datetime幾個庫,datetime.today()可以獲取當前時間,math.sin()和math.cos()用于計算表針的坐標。用到的方法主要是pygame.draw.circle()畫圓,和pygame.draw.line()畫線

開始下手

先把pygame初始化,再弄個窗口出來,準備工作做好

import math, pygame
from pygame.locals import *
from datetime import datetime, date, time

pygame.init()
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("Clock")

然后畫個圓當表盤,這樣就需要確定位置和半徑

pos_x = 300
pos_y = 300
radius = 250

考慮到區分三個表針的顏色,先設置好四種顏色

white = 255, 255, 255
red = 240, 0, 0
green = 0, 240, 0
blue = 0, 0, 240

計算表針的坐標,需要用到角度,所以先把角度設好

hour_angle = 0
minute_angle = 0
second_angle = 0

寫數字需要用到文字處理,把文字樣式設置一下

font = pygame.font.Font(None, 24)

最后還要寫兩個方法一個是輸出文字的,一個是規范角度的。這倆以后都經常用

# abs()是取絕對值,%運算符號很有意思,效果是360取余數,保證了角度在360以內
def wrap_angle(angle):
    return abs(angle % 360)

# 把打印文字的步驟封裝在一個方法里,每次方便調用,簡化代碼
def print_text(font, x, y, text, color):
    imgText = font.render(text, True, color)
    screen.blit(imgText, (x, y))

好了,準備工作做完了,我們來寫循環

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
    keys = pygame.key.get_pressed()
    if keys[K_ESCAPE]:
        exit()

這一段都是常規格式了,不解釋了,就是讓窗口能關掉。

然后把背景涂上一個顏色,不止一個人說我審美有問題了,所以我隨便選了個顏色,我都覺得有點丑

screen.fill((131, 139, 139))

我們先畫一個表盤

# 畫表盤
pygame.draw.circle(screen, white, (pos_x, pos_y), radius, 2)

在表盤上寫數字

# 寫表盤數字
for n in range(1, 13):  
    # 一共12個數字,平均分到一個圓內 每兩個數字之間的角度為 360/12
    x = math.cos(math.radians(angle)) * (radius - 10) - 5
    y = math.sin(math.radians(angle)) * (radius - 10) - 7
    print_text(font, pos_x + x, pos_y + y, str(n), white)

這里說道說道幾個常用函數和概念,防止以后時間長了自己都忘

range(x,y)

作用是從x開始到y結束,但不包括y,所以range(1,13) 就是從1到12,如果x不填,則默認從0開始

math.randians(angle)、math.sin()、math.cos()

這里比較繞了,要遍歷一個圓周,我們需要三個參數,圓心坐標(pos_x,pos_y),半徑(radius),和角度 (angle),然后通過三角函數里的正弦和余弦兩個函數乘以半徑,計算出每個點的坐標(x,y),而正弦和余弦函數需要的參數是弧度,所以需要用 math.randians(angle)將角度轉化成弧度

問題來了,為啥正弦余弦乘以半徑可以得出圓周上點的坐標呢?

給個圖自己看,很簡單

想象一下A點是圓心,B點是圓周上的點,AB是圓的半徑,那么B點的x坐標就是 cosA乘以AB,y坐標就是sinA乘以AB

計算x,y坐標時候 -5 -7又是為啥呢?

因為pygame里畫模型的時候,坐標是模型的左上角并不是模型的中心點,無論圖片還是文字還是其他什么都是這樣,所以需要減掉幾個像素,使模型出現在正確的位置,不然會往右下偏,這點以后要經常用到

目前為止,表盤畫好了 ,是這個樣子的

開始畫表針
我們首先拿到當前的時間

# 獲取時間
time = datetime.today()
hour = time.hour % 12
minute = time.minute
second = time.second

畫秒針

# 畫秒針
second_angle = wrap_angle(second * (360 / 60) - 90)  # 秒針是60進制,所以一秒的角度為 360/60
second_x = math.cos(math.radians(second_angle)) * (radius - 3)
second_y = math.sin(math.radians(second_angle)) * (radius - 3)
pygame.draw.line(screen, blue, (pos_x, pos_y), (pos_x + second_x, pos_y + second_y), 2)

問題又來了,為啥要 -90

因為畫圓的時候,0度是在3點鐘方向的,而實際情況下,我們希望0度在12點鐘方向,所以要減掉90度,達到需要

radius - 3 是為了讓秒針短一些,不至于戳到表盤上
解決了秒針,分針時針就簡單了

畫分針和時針

# 畫分針
    minute_angle = wrap_angle(minute * (360 / 60) - 90)  # 分針也是60進制,原理同秒針
    minute_x = math.cos(math.radians(minute_angle)) * (radius - 40)
    minute_y = math.sin(math.radians(minute_angle)) * (radius - 40)
    pygame.draw.line(screen, green, (pos_x, pos_y), (pos_x + minute_x, pos_y + minute_y), 4)
    # 畫時針
    # 時針算角度時增加了一部分,因為鐘表分針走的時候,時針也在走一個很小的角度 即30/60,
    # 加上這個角度,表才更加逼真,否則分針走的時候,時針一直保持指到整點,是錯誤的
    hour_angle = wrap_angle(hour * (360 / 12) - 90) + minute * 30 / 60
    hour_x = math.cos(math.radians(hour_angle)) * (radius - 80)
    hour_y = math.sin(math.radians(hour_angle)) * (radius - 80)
    pygame.draw.line(screen, red, (pos_x, pos_y), (pos_x + hour_x, pos_y + hour_y), 6)

這里有點小技巧,我們看到計算hour_angle的時候,在后面加了 minute * 30 / 60,這里實際上應該這么寫minute / 60* (360/12) minute是當前的分鐘數,拿他除以60分鐘得到一個比例,然后12個小時,每兩個數字之間的角度是360/12即30度
加上這一塊,使分針每走一分鐘,時針也會相應的走一點,更逼真不是

然后寫上當前時間,比較表針位置是不是當前時間

# 寫時間
    print_text(font, 10, 10, str(hour) + " : " + str(minute) + " : " + str(second), white)

最后在圓點位置畫一個點,蓋住三個表針交叉的位置,好看一點

# 畫表中心的圓點 之所以放在最后是想蓋住三個針的原點
    pygame.draw.circle(screen, white, (pos_x, pos_y), 8, 0)

最最后,別忘了刷新

pygame.display.update()

完整代碼如下

import math, pygame
from pygame.locals import *
from datetime import datetime, date, time

pygame.init()
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("Clock")

pos_x = 300
pos_y = 300
radius = 250

white = 255, 255, 255
red = 240, 0, 0
green = 0, 240, 0
blue = 0, 0, 240

hour_angle = 0
minute_angle = 0
second_angle = 0

font = pygame.font.Font(None, 24)


def wrap_angle(angle):
    return abs(angle % 360)


def print_text(font, x, y, text, color):
    imgText = font.render(text, True, color)
    screen.blit(imgText, (x, y))


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
    keys = pygame.key.get_pressed()
    if keys[K_ESCAPE]:
        exit()

    screen.fill((131, 139, 139))

    # 畫表盤
    pygame.draw.circle(screen, white, (pos_x, pos_y), radius, 2)

    # 寫表盤數字
    for n in range(1, 13):  # range(x,y)是從x開始到y結束 但不包括y,所以這里是1-13
        # 一共12個數字,平均分到一個圓內 每兩個數字之間的角度為 360/12
        # 減90是因為默認開始點是3點鐘方向,而實際上是12點鐘方向,下面畫分針、時針、秒針時也是這個道理
        angle = n * 360 / 12 - 90
        # 這里x,y減5減7,是因為寫文字的時候坐標不是文字的中心點而是文字的左上角
        # ,所以文字會顯得往右下角偏,稍微的修正看起來更舒服
        x = math.cos(math.radians(angle)) * (radius - 10) - 5
        y = math.sin(math.radians(angle)) * (radius - 10) - 7
        print_text(font, pos_x + x, pos_y + y, str(n), white)

    # 獲取時間
    time = datetime.today()
    hour = time.hour % 12
    minute = time.minute
    second = time.second

    # 畫秒針
    second_angle = wrap_angle(second * (360 / 60) - 90)  # 秒針是60進制,所以一秒的角度為 360/60
    second_x = math.cos(math.radians(second_angle)) * (radius - 3)
    second_y = math.sin(math.radians(second_angle)) * (radius - 3)
    pygame.draw.line(screen, blue, (pos_x, pos_y), (pos_x + second_x, pos_y + second_y), 2)
    # 畫分針
    minute_angle = wrap_angle(minute * (360 / 60) - 90)  # 分針也是60進制,原理同秒針
    minute_x = math.cos(math.radians(minute_angle)) * (radius - 40)
    minute_y = math.sin(math.radians(minute_angle)) * (radius - 40)
    pygame.draw.line(screen, green, (pos_x, pos_y), (pos_x + minute_x, pos_y + minute_y), 4)
    # 畫時針
    # 時針算角度時增加了一部分,因為鐘表分針走的時候,時針也在走一個很小的角度 即30/60,
    # 加上這個角度,表才更加逼真,否則分針走的時候,時針一直保持指到整點,是錯誤的
    hour_angle = wrap_angle(hour * (360 / 12) - 90) + minute * 30 / 60
    hour_x = math.cos(math.radians(hour_angle)) * (radius - 80)
    hour_y = math.sin(math.radians(hour_angle)) * (radius - 80)
    pygame.draw.line(screen, red, (pos_x, pos_y), (pos_x + hour_x, pos_y + hour_y), 6)

    # 寫時間
    print_text(font, 10, 10, str(hour) + " : " + str(minute) + " : " + str(second), white)

    # 畫表中心的圓點 之所以放在最后是想蓋住三個針的原點
    pygame.draw.circle(screen, white, (pos_x, pos_y), 8, 0)


    pygame.display.update()

效果圖

還是很丑,但是基本功能都實現了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Python使用Pygame繪制時鐘

標簽:洛陽 怒江 清遠 吉林 長春 泉州 安慶 岳陽

巨人網絡通訊聲明:本文標題《pygame實現時鐘效果》,本文關鍵詞  pygame,實現,時鐘,效果,pygame,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《pygame實現時鐘效果》相關的同類信息!
  • 本頁收集關于pygame實現時鐘效果的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品久久一级| 欧美精品一区二区三区蜜臀| 蜜桃精品视频在线| 免费人成黄页网站在线一区二区| 蜜桃av一区二区三区电影| 国产精品一区二区三区乱码| 国内精品嫩模私拍在线| 成人免费的视频| 欧美日韩精品电影| 国产偷国产偷精品高清尤物| 亚洲美女淫视频| 蜜乳av一区二区| 色婷婷综合五月| 日韩欧美另类在线| 国产精品入口麻豆九色| 亚洲成av人片在www色猫咪| 激情综合色丁香一区二区| 91网站在线播放| 精品国产乱码久久久久久蜜臀| 中文成人综合网| 亚洲成av人片在线观看| 成人在线综合网| 日韩精品中文字幕一区二区三区| 亚洲黄色尤物视频| 高清不卡在线观看av| 这里只有精品99re| 一级中文字幕一区二区| 久国产精品韩国三级视频| 欧美丝袜丝交足nylons| 中文字幕一区二区三区在线不卡| 男女男精品视频网| 91福利在线观看| 国产精品夫妻自拍| 狠狠色丁香久久婷婷综| 91精品婷婷国产综合久久| 中文字幕一区二区三区乱码在线| 久久综合综合久久综合| 欧美日韩精品一区二区在线播放| 亚洲国产精品成人综合 | 日韩一区二区三区观看| 国产精品久线在线观看| 国产成人在线视频网站| 日韩一区二区三区四区五区六区| 亚洲一二三区视频在线观看| 国产成人av自拍| 久久一区二区视频| 亚洲视频一二三| 国产高清久久久| 日韩一区二区三区视频在线| 亚洲天天做日日做天天谢日日欢| 大白屁股一区二区视频| 日韩一卡二卡三卡| 日本不卡视频一二三区| 欧美精品自拍偷拍| 日本在线不卡视频| 这里是久久伊人| 久久精品国产77777蜜臀| 精品欧美黑人一区二区三区| 青草av.久久免费一区| 日韩亚洲欧美一区| 国产一区二区三区日韩| 国产午夜亚洲精品午夜鲁丝片| 国内一区二区在线| 中文字幕乱码久久午夜不卡 | 成人一区在线观看| 精品国产乱码久久久久久1区2区 | 亚洲一区在线播放| 在线视频观看一区| 午夜精品免费在线| 337p亚洲精品色噜噜狠狠| 蜜桃视频第一区免费观看| 91精品国产综合久久福利| 日产精品久久久久久久性色| 日韩欧美精品在线| 国产福利一区二区三区| 国产欧美日韩三级| 成人a免费在线看| 国产精品九色蝌蚪自拍| 色偷偷久久一区二区三区| 亚洲va欧美va人人爽午夜| 91精品国产乱| 国产成+人+日韩+欧美+亚洲| 亚洲欧美国产三级| 欧美蜜桃一区二区三区| 国产精品综合在线视频| 亚洲精品国产高清久久伦理二区| 欧美日韩一级视频| 日韩精品国产欧美| 国产女主播在线一区二区| av在线不卡观看免费观看| 一区二区三区蜜桃| 精品国产一区二区三区av性色| 国内精品久久久久影院薰衣草| 中文字幕精品一区二区三区精品| 精品视频在线免费看| 日韩二区三区在线观看| 国产精品久久一卡二卡| 欧美一区二区三区视频在线观看| 成人免费三级在线| 秋霞国产午夜精品免费视频| 欧美精品一区二区三区一线天视频 | 亚洲韩国精品一区| 日韩一区二区三免费高清| 国产剧情一区二区三区| 亚洲人吸女人奶水| 精品国产一区二区三区不卡 | 夜夜嗨av一区二区三区| 久久综合久久鬼色| 91福利资源站| 成人小视频在线观看| 日韩国产高清在线| 亚洲黄色小视频| 国产精品国产馆在线真实露脸| 欧美一区二区三区爱爱| 欧美午夜在线一二页| 国产精品资源站在线| 天天影视涩香欲综合网| 中文字幕一区二区视频| 久久麻豆一区二区| 91精品久久久久久久久99蜜臂| 色丁香久综合在线久综合在线观看| 国产一区二区精品久久| 美国毛片一区二区三区| 亚洲成人777| 亚洲久本草在线中文字幕| 国产欧美日产一区| 精品久久久久久久久久久久久久久| 欧美色涩在线第一页| 日本丰满少妇一区二区三区| 丁香六月综合激情| 丰满白嫩尤物一区二区| 国产一区二区三区在线观看精品| 免费视频一区二区| 丝袜美腿一区二区三区| 亚洲国产一区二区视频| 中文字幕一区二区三区色视频| 中文乱码免费一区二区| 中文字幕的久久| 国产精品拍天天在线| 日本一区二区三区四区在线视频| 欧美一级日韩一级| 欧美大度的电影原声| 久久综合久久久久88| 精品国产免费视频| 久久精品欧美日韩精品| 久久精品一区蜜桃臀影院| 国产精品你懂的在线| 国产午夜精品理论片a级大结局| 欧美日韩国产美| 日韩视频123| 久久亚洲精品小早川怜子| 欧美精品精品一区| 欧美人狂配大交3d怪物一区| 欧美专区在线观看一区| 欧美老肥妇做.爰bbww| 7777精品伊人久久久大香线蕉 | 狠狠色2019综合网| 成人少妇影院yyyy| 欧美亚洲禁片免费| 欧美日韩一区久久| 色综合久久中文综合久久牛| 欧美三级电影在线观看| 日韩欧美成人激情| 日本一区二区久久| 亚洲午夜激情网页| 蜜桃视频在线一区| 国产精品一线二线三线| 色综合婷婷久久| 6080午夜不卡| 国产精品美女www爽爽爽| 亚洲一二三区在线观看| 麻豆成人在线观看| 国产麻豆视频精品| 日本大香伊一区二区三区| 日韩欧美在线不卡| 国产精品乱人伦中文| 亚洲福利视频一区| 日本欧美肥老太交大片| 日韩欧美高清在线| 国产精品久久久久久福利一牛影视 | 色综合久久综合网欧美综合网 | 亚洲va欧美va天堂v国产综合| 美女视频黄免费的久久| 9人人澡人人爽人人精品| 678五月天丁香亚洲综合网| 国产精品理伦片| 久久爱另类一区二区小说| 色婷婷综合在线| 国产三区在线成人av| 亚洲成人自拍网| 成人av资源在线观看| 欧美一区二区三区成人| 一区二区三区中文免费| 国产v日产∨综合v精品视频| 欧美一级片在线| 亚洲自拍偷拍综合| 成人午夜视频在线观看| 欧美成人女星排行榜| 午夜精品久久久久久久蜜桃app| 不卡一区中文字幕|