欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

前期準(zhǔn)備

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

開(kāi)始下手

先把pygame初始化,再弄個(gè)窗口出來(lái),準(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")

然后畫(huà)個(gè)圓當(dāng)表盤(pán),這樣就需要確定位置和半徑

pos_x = 300
pos_y = 300
radius = 250

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

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

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

hour_angle = 0
minute_angle = 0
second_angle = 0

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

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

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

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

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

好了,準(zhǔn)備工作做完了,我們來(lái)寫(xiě)循環(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)掉。

然后把背景涂上一個(gè)顏色,不止一個(gè)人說(shuō)我審美有問(wèn)題了,所以我隨便選了個(gè)顏色,我都覺(jué)得有點(diǎn)丑

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

我們先畫(huà)一個(gè)表盤(pán)

# 畫(huà)表盤(pán)
pygame.draw.circle(screen, white, (pos_x, pos_y), radius, 2)

在表盤(pán)上寫(xiě)數(shù)字

# 寫(xiě)表盤(pán)數(shù)字
for n in range(1, 13):  
    # 一共12個(gè)數(shù)字,平均分到一個(gè)圓內(nèi) 每?jī)蓚€(gè)數(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)

這里說(shuō)道說(shuō)道幾個(gè)常用函數(shù)和概念,防止以后時(shí)間長(zhǎng)了自己都忘

range(x,y)

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

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

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

問(wèn)題來(lái)了,為啥正弦余弦乘以半徑可以得出圓周上點(diǎn)的坐標(biāo)呢?

給個(gè)圖自己看,很簡(jiǎn)單

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

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

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

目前為止,表盤(pán)畫(huà)好了 ,是這個(gè)樣子的

開(kāi)始畫(huà)表針
我們首先拿到當(dāng)前的時(shí)間

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

畫(huà)秒針

# 畫(huà)秒針
second_angle = wrap_angle(second * (360 / 60) - 90)  # 秒針是60進(jìn)制,所以一秒的角度為 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)

問(wèn)題又來(lái)了,為啥要 -90

因?yàn)楫?huà)圓的時(shí)候,0度是在3點(diǎn)鐘方向的,而實(shí)際情況下,我們希望0度在12點(diǎn)鐘方向,所以要減掉90度,達(dá)到需要

radius - 3 是為了讓秒針短一些,不至于戳到表盤(pán)上
解決了秒針,分針時(shí)針就簡(jiǎn)單了

畫(huà)分針和時(shí)針

# 畫(huà)分針
    minute_angle = wrap_angle(minute * (360 / 60) - 90)  # 分針也是60進(jìn)制,原理同秒針
    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)
    # 畫(huà)時(shí)針
    # 時(shí)針?biāo)憬嵌葧r(shí)增加了一部分,因?yàn)殓姳矸轴樧叩臅r(shí)候,時(shí)針也在走一個(gè)很小的角度 即30/60,
    # 加上這個(gè)角度,表才更加逼真,否則分針走的時(shí)候,時(shí)針一直保持指到整點(diǎn),是錯(cuò)誤的
    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)

這里有點(diǎn)小技巧,我們看到計(jì)算hour_angle的時(shí)候,在后面加了 minute * 30 / 60,這里實(shí)際上應(yīng)該這么寫(xiě)minute / 60* (360/12) minute是當(dāng)前的分鐘數(shù),拿他除以60分鐘得到一個(gè)比例,然后12個(gè)小時(shí),每?jī)蓚€(gè)數(shù)字之間的角度是360/12即30度
加上這一塊,使分針每走一分鐘,時(shí)針也會(huì)相應(yīng)的走一點(diǎn),更逼真不是

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

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

最后在圓點(diǎn)位置畫(huà)一個(gè)點(diǎn),蓋住三個(gè)表針交叉的位置,好看一點(diǎn)

# 畫(huà)表中心的圓點(diǎn) 之所以放在最后是想蓋住三個(gè)針的原點(diǎn)
    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))

    # 畫(huà)表盤(pán)
    pygame.draw.circle(screen, white, (pos_x, pos_y), radius, 2)

    # 寫(xiě)表盤(pán)數(shù)字
    for n in range(1, 13):  # range(x,y)是從x開(kāi)始到y(tǒng)結(jié)束 但不包括y,所以這里是1-13
        # 一共12個(gè)數(shù)字,平均分到一個(gè)圓內(nèi) 每?jī)蓚€(gè)數(shù)字之間的角度為 360/12
        # 減90是因?yàn)槟J(rèn)開(kāi)始點(diǎn)是3點(diǎn)鐘方向,而實(shí)際上是12點(diǎn)鐘方向,下面畫(huà)分針、時(shí)針、秒針時(shí)也是這個(gè)道理
        angle = n * 360 / 12 - 90
        # 這里x,y減5減7,是因?yàn)閷?xiě)文字的時(shí)候坐標(biāo)不是文字的中心點(diǎn)而是文字的左上角
        # ,所以文字會(huì)顯得往右下角偏,稍微的修正看起來(lái)更舒服
        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í)間
    time = datetime.today()
    hour = time.hour % 12
    minute = time.minute
    second = time.second

    # 畫(huà)秒針
    second_angle = wrap_angle(second * (360 / 60) - 90)  # 秒針是60進(jìn)制,所以一秒的角度為 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)
    # 畫(huà)分針
    minute_angle = wrap_angle(minute * (360 / 60) - 90)  # 分針也是60進(jìn)制,原理同秒針
    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)
    # 畫(huà)時(shí)針
    # 時(shí)針?biāo)憬嵌葧r(shí)增加了一部分,因?yàn)殓姳矸轴樧叩臅r(shí)候,時(shí)針也在走一個(gè)很小的角度 即30/60,
    # 加上這個(gè)角度,表才更加逼真,否則分針走的時(shí)候,時(shí)針一直保持指到整點(diǎn),是錯(cuò)誤的
    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)

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

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


    pygame.display.update()

效果圖

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

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

您可能感興趣的文章:

相關(guān)文章

  • Python實(shí)現(xiàn)爬蟲(chóng)設(shè)置代理IP和偽裝成瀏覽器的方法分享

    Python實(shí)現(xiàn)爬蟲(chóng)設(shè)置代理IP和偽裝成瀏覽器的方法分享

    今天小編就為大家分享一篇Python實(shí)現(xiàn)爬蟲(chóng)設(shè)置代理IP和偽裝成瀏覽器的方法分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • keras slice layer 層實(shí)現(xiàn)方式

    keras slice layer 層實(shí)現(xiàn)方式

    這篇文章主要介紹了keras slice layer 層實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python類和對(duì)象基礎(chǔ)入門(mén)介紹

    Python類和對(duì)象基礎(chǔ)入門(mén)介紹

    Python 是一種面向?qū)ο蟮木幊陶Z(yǔ)言。Python 中的幾乎所有東西都是對(duì)象,擁有屬性和方法。類(Class)類似對(duì)象構(gòu)造函數(shù),或者是用于創(chuàng)建對(duì)象的藍(lán)圖
    2022-08-08
  • Python字符串格式化輸出方法分析

    Python字符串格式化輸出方法分析

    這篇文章主要介紹了Python字符串格式化輸出方法,結(jié)合實(shí)例形式分析了Python格式化構(gòu)建字符串的三種常用技巧,需要的朋友可以參考下
    2016-04-04
  • Python正則表達(dá)式教程之三:貪婪/非貪婪特性

    Python正則表達(dá)式教程之三:貪婪/非貪婪特性

    這篇文章主要介紹了Python正則表達(dá)式中貪婪/非貪婪特性的相關(guān)資料,文中通過(guò)示例代碼介紹的很詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友下面來(lái)一起看看吧。
    2017-03-03
  • Python 除法小技巧

    Python 除法小技巧

    Python中將兩個(gè)整數(shù)相除,默認(rèn)結(jié)果是為整數(shù)的。但我們可以通過(guò)下面的方法,使得兩個(gè)整數(shù)相除的結(jié)果為小數(shù)。
    2008-09-09
  • 淺談Python數(shù)據(jù)類型判斷及列表腳本操作

    淺談Python數(shù)據(jù)類型判斷及列表腳本操作

    下面小編就為大家?guī)?lái)一篇淺談Python數(shù)據(jù)類型判斷及列表腳本操作。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • Python數(shù)據(jù)處理Pandas庫(kù)的使用詳解

    Python數(shù)據(jù)處理Pandas庫(kù)的使用詳解

    這篇文章主要為大家詳細(xì)介紹了pandas庫(kù)的使用方法,包括數(shù)據(jù)導(dǎo)入與導(dǎo)出、數(shù)據(jù)查看和篩選、數(shù)據(jù)處理和分組操作等,感興趣的小伙伴可以了解一下
    2023-07-07
  • Python APScheduler執(zhí)行使用方法詳解

    Python APScheduler執(zhí)行使用方法詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于Python APScheduler執(zhí)行使用方法的相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Django中celery的使用項(xiàng)目實(shí)例

    Django中celery的使用項(xiàng)目實(shí)例

    Celery是?個(gè) 基于python開(kāi)發(fā)的分布式異步消息任務(wù)隊(duì)列,通過(guò)它可以輕松的實(shí)現(xiàn)任務(wù)的異步處理,下面這篇文章主要給大家介紹了關(guān)于Django中celery使用的相關(guān)資料,需要的朋友可以參考下
    2022-07-07

最新評(píng)論