最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pygame實現(xiàn)時鐘效果

 更新時間:2021年06月16日 10:56:45   作者:靠譜的人  
這篇文章主要為大家詳細介紹了pygame實現(xiàn)時鐘效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

用pygame做一個時鐘,供大家參考,具體內(nèi)容如下

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

前期準(zhǔn)備

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

開始下手

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

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")

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

pos_x = 300
pos_y = 300
radius = 250

考慮到區(qū)分三個表針的顏色,先設(shè)置好四種顏色

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

計算表針的坐標(biāo),需要用到角度,所以先把角度設(shè)好

hour_angle = 0
minute_angle = 0
second_angle = 0

寫數(shù)字需要用到文字處理,把文字樣式設(shè)置一下

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

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

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

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

好了,準(zhǔn)備工作做完了,我們來寫循環(huán)

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

這一段都是常規(guī)格式了,不解釋了,就是讓窗口能關(guān)掉。

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

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

我們先畫一個表盤

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

在表盤上寫數(shù)字

# 寫表盤數(shù)字
for n in range(1, 13):  
    # 一共12個數(shù)字,平均分到一個圓內(nèi) 每兩個數(shù)字之間的角度為 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)

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

range(x,y)

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

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

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

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

給個圖自己看,很簡單

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

計算x,y坐標(biāo)時候 -5 -7又是為啥呢?

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

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

開始畫表針
我們首先拿到當(dāng)前的時間

# 獲取時間
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)
    # 畫時針
    # 時針?biāo)憬嵌葧r增加了一部分,因為鐘表分針走的時候,時針也在走一個很小的角度 即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,這里實際上應(yīng)該這么寫minute / 60* (360/12) minute是當(dāng)前的分鐘數(shù),拿他除以60分鐘得到一個比例,然后12個小時,每兩個數(shù)字之間的角度是360/12即30度
加上這一塊,使分針每走一分鐘,時針也會相應(yīng)的走一點,更逼真不是

然后寫上當(dāng)前時間,比較表針位置是不是當(dāng)前時間

# 寫時間
    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)

    # 寫表盤數(shù)字
    for n in range(1, 13):  # range(x,y)是從x開始到y(tǒng)結(jié)束 但不包括y,所以這里是1-13
        # 一共12個數(shù)字,平均分到一個圓內(nèi) 每兩個數(shù)字之間的角度為 360/12
        # 減90是因為默認(rèn)開始點是3點鐘方向,而實際上是12點鐘方向,下面畫分針、時針、秒針時也是這個道理
        angle = n * 360 / 12 - 90
        # 這里x,y減5減7,是因為寫文字的時候坐標(biāo)不是文字的中心點而是文字的左上角
        # ,所以文字會顯得往右下角偏,稍微的修正看起來更舒服
        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)
    # 畫時針
    # 時針?biāo)憬嵌葧r增加了一部分,因為鐘表分針走的時候,時針也在走一個很小的角度 即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()

效果圖

還是很丑,但是基本功能都實現(xiàn)了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • tensorflow 動態(tài)獲取 BatchSzie 的大小實例

    tensorflow 動態(tài)獲取 BatchSzie 的大小實例

    這篇文章主要介紹了tensorflow 動態(tài)獲取 BatchSzie 的大小實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python游戲庫pygame經(jīng)典教程(推薦!)

    python游戲庫pygame經(jīng)典教程(推薦!)

    Python Pygame是一款專門為開發(fā)和設(shè)計 2D 電子游戲而生的軟件包,是入門級游戲開發(fā)庫,下面這篇文章主要給大家介紹了python游戲庫pygame經(jīng)典教程的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Python with用法:自動關(guān)閉文件進程

    Python with用法:自動關(guān)閉文件進程

    這篇文章主要介紹了Python with用法:自動關(guān)閉文件進程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 使用python?AI快速比對兩張人臉圖像及遇到的坑

    使用python?AI快速比對兩張人臉圖像及遇到的坑

    這篇文章主要介紹了如何使用python?AI快速比對兩張人臉圖像?實現(xiàn)過程比較簡單,但是第三方python依賴的安裝過程較為曲折,下面是通過實踐對比總結(jié)出來的能夠支持的幾個版本,避免大家踩坑,需要的朋友可以參考下
    2023-02-02
  • rhythmbox中文名亂碼問題解決方法

    rhythmbox中文名亂碼問題解決方法

    在使用rhythmbox過程中,出現(xiàn)了,如果是中文名則會出現(xiàn)亂碼,下面的方法即可解決
    2008-09-09
  • python通過BF算法實現(xiàn)關(guān)鍵詞匹配的方法

    python通過BF算法實現(xiàn)關(guān)鍵詞匹配的方法

    這篇文章主要介紹了python通過BF算法實現(xiàn)關(guān)鍵詞匹配的方法,實例分析了BF算法的原理與Python實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 詳解Python中靜態(tài)類型語言的寫法

    詳解Python中靜態(tài)類型語言的寫法

    眾所周知,python是一種動態(tài)類型語言,但是,從v3.6版本開始,開始支持靜態(tài)類型的寫法,下面小編就來和大家聊聊Python中靜態(tài)類型語言的具體寫法吧
    2023-07-07
  • 解決pycharm最左側(cè)Tool Buttons顯示不全的問題

    解決pycharm最左側(cè)Tool Buttons顯示不全的問題

    今天小編就為大家分享一篇解決pycharm最左側(cè)Tool Buttons顯示不全的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python transpose()處理高維度數(shù)組的軸變換的實現(xiàn)

    python transpose()處理高維度數(shù)組的軸變換的實現(xiàn)

    本文主要介紹了python transpose()處理高維度數(shù)組的軸變換的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Python數(shù)據(jù)類型之Tuple元組實例詳解

    Python數(shù)據(jù)類型之Tuple元組實例詳解

    這篇文章主要介紹了Python數(shù)據(jù)類型之Tuple元組,結(jié)合實例形式分析了Python元組類型的概念、定義、讀取、連接、判斷等常見操作技巧與相關(guān)注意事項,需要的朋友可以參考下
    2019-05-05

最新評論

哈尔滨市| 安图县| 五峰| 东乡县| 漯河市| 垫江县| 夏邑县| 福海县| 商都县| 来凤县| 郓城县| 玛曲县| 彩票| 盈江县| 萨迦县| 噶尔县| 靖安县| 蒙阴县| 乌什县| 花莲市| 廊坊市| 武穴市| 张家口市| 泸州市| 山西省| 清丰县| 讷河市| 平度市| 黔江区| 江门市| 东方市| 永登县| 石泉县| 灵璧县| 德昌县| 浠水县| 宁河县| 宁德市| 福清市| 汪清县| 云南省|