【PB案例學習筆記】-13 徒手做個電子時鐘

寫在前面

這是PB案例學習筆記系列文章的第11篇,該系列文章適合具有一定PB基礎的讀者。

通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。

文章中設計到的源碼,小凡都上傳到了gitee代碼倉庫https://gitee.com/xiezhr/pb-project-example.git

gitee代碼倉庫

需要源代碼的小伙伴們可以自行下載查看,后續文章涉及到的案例代碼也都會提交到這個倉庫【pb-project-example

如果對小伙伴有所幫助,希望能給一個小星星?支持一下小凡。

一、小目標

上一篇中我們使用Timer時間制作了一個秒表,之后就有小伙伴問了,秒表都做了,能不能做個電子時鐘呢?

當然可以了,這就安排上。這篇文章我們將使用到新的控件Oval來做一個鐘表框,

利用Now()Hour()、Minute()Second()等日期時間函數將系統時間顯示在文本框中;

利用Sin()Cos()Pi()等數學函數來來控制時針、分針、秒針實現下圖所示的電子時鐘;

利用WindowTimer時間讓時鐘走起來。最終實現下面的效果

電子時鐘

二、時間日期函數

在之前的案例中我們并沒有接觸過日期時間函數,而這些函數在日常開發中也是使用比較頻繁的。

現在我們來具體說說這些函數都是怎么用的。

函數名稱返回值功能描述
DayInteger返回日期的天數值
DayNameString返回日期的星期值
DayNumberInteger返回日期為該周的第幾天
DaysAfterLong返回兩個日期的間隔天數
HourInteger返回時間的小時值
MinuteInteger返回時間的分鐘值
MonthInteger返回日期的月份值
NowTime返回系統的當前時間
RelativeDateDate返回日期之后指定天數的日期
RelativeTimeTime返回指定時間前后指定秒數的時間
SecondInteger返回時間的秒數值
SecondAfterLOng返回兩個時間的間隔秒數
TodayDate返回系統當前日期
YearInteger返回日期的年份

三、Oval控件簡介

Oval控件是一種圖形控件,用于在窗口或用戶界面上繪制橢圓或圓形。

在這篇文章中我們就通過該控件繪制了一個表盤及各個時刻點

四、創建程序基本框架

① 建立examplework工作區

② 建立exampleapp應用

③ 新建w_main窗口,標題Title設置為電子時鐘

以上步驟如果忘記的小伙伴可以翻一翻該系列的第一篇文章

④ 新建控件

w_main窗口中新建一個SingleLineEdit控件、13個Oval控件和4個StaticText控件和3個Line控件

SingleLineEdit控件用來顯示數字時間,一個Oval控件用來做鐘表盤,其他12個Oval控件指示小時位置,

4個StaticText分別顯示3、6、9、12 四個小時數值,3個Line控件分別作為時針、分針和秒針

控件布局

⑤ 將上面畫好的窗口保存為w_main

五、編寫事件代碼

① 定義全局變量

定義三個全局變量,分別表示小時、分鐘、秒

long  l_hour, l_Min,l_Sec

② 在w_main窗口的open事件中添加如下代碼

// 獲取當前時間的秒數,并賦值給變量l_sec
l_sec = Second(Now())// 獲取當前時間的分鐘數,并賦值給變量l_Min
l_Min = Minute(Now())// 獲取當前時間的小時數,并賦值給變量l_hour
l_hour = Hour(Now())// 如果小時數大于12,將小時數轉換為12小時制
if l_hour > 12 thenl_hour = l_hour - 12
end if// 設置線條ln_1的起始Y坐標為ov_1對象的Y坐標加上ov_1高度的一半
ln_1.BeginY = ov_1.y + ov_1.height / 2// 設置線條ln_1的起始X坐標為ov_1對象的X坐標加上ov_1寬度的一半
ln_1.BeginX = ov_1.x + ov_1.width / 2// 計算線條ln_1的結束Y坐標,基于當前秒數和角度45度,使用正弦函數
ln_1.EndY = ln_1.BeginY + 580 * Sin(Pi(l_sec + 45) / 30)// 計算線條ln_1的結束X坐標,基于當前秒數和角度45度,使用余弦函數
ln_1.EndX = ln_1.BeginX + 580 * Cos(Pi(l_sec + 45) / 30)// 設置線條ln_2的起始X和Y坐標與ln_1相同
ln_2.BeginX = ln_1.BeginX
ln_2.BeginY = ln_1.BeginY// 計算線條ln_2的結束X坐標,基于當前分鐘數和角度45度,使用正弦函數
ln_2.EndX = ln_2.BeginX + 550 * Sin(Pi(l_Min + 45) / 30)// 計算線條ln_2的結束Y坐標,基于當前分鐘數和角度45度,使用余弦函數
ln_2.EndY = ln_2.BeginY + 550 * Cos(Pi(l_Min + 45) / 30)// 設置線條ln_3的起始X和Y坐標與ln_1相同
ln_3.BeginX = ln_1.BeginX
ln_3.BeginY = ln_1.BeginY// 計算線條ln_3的結束X坐標,基于12小時制的小時數、分鐘數和角度,使用正弦函數
ln_3.EndX = ln_3.BeginX + 520 * Sin(Pi(((12 - l_hour) * 60 - l_Min - 360) / 360))// 計算線條ln_3的結束Y坐標,基于12小時制的小時數、分鐘數和角度,使用余弦函數
ln_3.EndY = ln_3.BeginY + 520 * Cos(Pi(((12 - l_hour) * 60 - l_Min - 360) / 360))// 調用定時器,通常會觸發周期性執行這段代碼
Timer(1)

③ 在w_main窗口的Timer事件中添加如下代碼

// 聲明一個time類型變量t_now,用于存儲當前時間
time t_now// 獲取當前系統時間,并賦值給t_now
t_now = Now()// 提取當前時間的小時數,并賦值給整型變量l_hour
l_hour = Hour(t_now)// 提取當前時間的分鐘數,并賦值給整型變量l_min
l_min = Minute(t_now)// 提取當前時間的秒數,并賦值給整型變量l_sec
l_sec = Second(t_now)// 如果小時數大于12,將小時數轉換為12小時制
if l_hour > 12 thenl_hour = l_hour - 12
end if// 將當前時間t_now轉換為字符串,并設置滑塊sle_1的文本
sle_1.text = String(t_now)// 更新線條ln_1的結束Y坐標,基于當前秒數和角度45度,使用正弦函數
ln_1.EndY = ln_1.BeginY + 580 * Sin(Pi((l_Sec + 45) / 30))// 更新線條ln_1的結束X坐標,基于當前秒數和角度45度,使用余弦函數
ln_1.EndX = ln_1.BeginX + 580 * Cos(Pi((l_Sec + 45) / 30))// 更新線條ln_2的結束Y坐標,基于當前分鐘數和角度45度,使用正弦函數
ln_2.EndY = ln_2.BeginY + 550 * Sin(Pi((l_Min + 45) / 30))// 更新線條ln_2的結束X坐標,基于當前分鐘數和角度45度,使用余弦函數
ln_2.EndX = ln_2.BeginX + 550 * Cos(Pi((l_Min + 45) / 30))// 更新線條ln_3的結束X坐標,基于12小時制的小時數、分鐘數和角度,使用正弦函數
ln_3.EndX = ln_3.BeginX + 520 * Sin(Pi(((12 - l_hour) * 60 - l_Min - 360) / 360))// 更新線條ln_3的結束Y坐標,基于12小時制的小時數、分鐘數和角度,使用余弦函數
ln_3.EndY = ln_3.BeginY + 520 * Cos(Pi(((12 - l_hour) * 60 - l_Min - 360) / 360))

③ 在開發界面左邊的System Tree窗口中雙擊exampleApp應用對象,并在其open事件中添加如下代碼

open(w_main)

六、運行程序

到此大功告成了,一個簡單的電子時鐘基本完成了,我們來看看能不能達到我們預期的效果

電子時鐘最終效果

本期內容到這兒就結束了,希望對您有所幫助★,°:.☆( ̄▽ ̄)/$:.°★

我們下期再見 ヾ(?ω?`)o (●’?’●)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19196.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19196.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python基礎-數據結構-leetcode刷題必看-queue---隊列-python的底層構建

文章目錄 隊列雙端隊列 deque底層存儲deque接口1. __init__(self, iterable: Iterable[_T], maxlen: int | None None) -> None2. append(self, __x: _T) -> None3. appendleft(self, __x: _T) -> None4. copy(self) -> Self5. count(self, __x: _T) -> int6. …

java項目啟動報錯

java項目啟動報錯:java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field ‘com.sun.tools.javac.tree.JCTree qualid’ 原因:編譯和運行的版本不一樣 點擊idea文件 點擊項目結構 把這兩個版本…

軟件架構設計屬性之一:功能性屬性淺析

引言 軟件架構設計屬性中的功能性屬性是評估軟件架構是否滿足其預定功能需求的關鍵指標。功能性屬性確保軟件能夠執行其設計中的任務,并提供所需的服務。以下是對軟件架構設計中功能性屬性的淺析: 一、定義 功能性屬性是指軟件系統所具備的功能特性&a…

解決Android studio 一直提示下載gradle-xxx-all.zip問題

今天用AndroidStdiod打開一個新工程的時候,發現項目一直卡在正在下載gradle-xxx-all.zip的任務上,網絡出奇的慢,即使配了VPN也無濟于事,于是按照以往經驗:將gradle-xxx-all.zip下載到.gradle\gradle\wrapper\dists目錄…

【ESP32之旅】ESP32 PlatformIO 固件單獨燒錄

背景 有時候使用PIO編寫的代碼需要發給客戶去驗證,相比較于發送源碼直接發送bin文件,更加的安全而且高效。不用擔心源碼的泄漏,也不用幫客戶配置PIO環境。 操作方法 1.編譯 首先進行代碼編譯,如編譯成功會在 .pio\build\airm2…

python之any用法

寫法對比 代碼一: any(i for i in [0,1]) 代碼2: any([i for i in [0,1]]) 優劣 結論:代碼一寫法更好 解釋: 在 Python 中,any() 函數可以接受一個可迭代對象作為參數,并返回 True 如果可迭代對象…

詳解 Java 泛型:核心概念與實用示例

詳解 Java 泛型:核心概念與實用示例 Java 泛型(Generics)是Java SE 5引入的一項特性,旨在提高代碼的可重用性和類型安全性。通過泛型,開發者可以編寫一個通用的類、接口或方法,可以與多種類型一起工作&…

汽車電子學習【車載網絡CAN/LIN】

車載網絡CAN/LIN知識總結 STM32F1開發板測試 STM32測試程序 /** CAN 通信報文內容設置*/ void CAN_SetMsg(void) { #if CAN_STDTxMessage.StdId 0x12;TxMessage.IDE CAN_ID_STD; #elseTxMessage.ExtId 0x1314; //使用的擴展IDTxMessage.IDE CAN_ID_EXT; //擴展模式 #…

C++進程間通信 消息隊列

C進程間通信 消息隊列 消息隊列概述消息隊列代碼示例1. 創建和發送消息的程序(sender.cpp)2. 接收消息的程序(receiver.cpp) 代碼解釋運行步驟運行結果 消息隊列概述 消息隊列是一種進程間通信機制,允許一個或多個進程…

Django 做migrations時出錯,解決方案

在做migrations的時候,偶爾會出現出錯。 在已有數據的表中新增字段時,會彈出下面的信息 運行這個命令時 python manage.py makemigrationsTracking file by folder pattern: migrations It is impossible to add a non-nullable field ‘example’ to …

Linux---網絡相關配置

文章目錄 前言一、pandas是什么?二、使用步驟 1.引入庫2.讀入數據總結 前言 一臺主機需要配置必要的網絡信息,才可以連接到互聯網,需要的配置網絡信息包括IP,子網掩碼,網關和DNS。 一.查看網絡信息 查看IP信息可以通…

echarts高級應用

目錄 一、顯示相關 1.1、主題 1.1.1、內置主題 1.1.2、自定義主題 1.2、調色盤和顏色漸變 1.2.1、主題調色盤<全局調色盤<局部調色盤 1.2.2、線性漸變(linear)、徑向漸變(radial) 1.3、直接樣式和高亮樣式 1.3.1、直接樣式 1.3.2、高亮樣式 1.4、圖表自適應 …

Fine-tuning和模型訓練的關系

概述 Fine-tuning和模型訓練不是完全相同的概念&#xff0c;但它們之間有密切的關系&#xff0c;都是機器學習和深度學習過程中的重要步驟。 模型訓練是一個更廣泛的概念&#xff0c;指的是使用數據去調整模型的內部參數&#xff0c;以使得模型能夠從輸入數據中學習并做出預測…

軟件架構設計屬性之三:結構性屬性淺析

文章目錄 引言一、結構性屬性的定義二、結構性屬性的關鍵要素1. 組件化2. 模塊化3. 層次化4. 接口定義5. 數據流6. 依賴管理 三、結構性屬性的設計原則1. 高內聚低耦合2. 松耦合3. 清晰的接口4. 可維護性5. 可擴展性 四、結構性屬性的實現策略1. 組件劃分2. 模塊化設計3. 接口設…

【AREngine BUG 解決方法】無法獲取有效的相機圖像尺寸

近期拿了一臺 華為mate20 Pro的手機&#xff0c;在運行AR示例的過程中出現了黑屏。 問題排查 SDK版本&#xff1a;com.huawei.hms:arenginesdk:3.7.0.3 定位 經排查&#xff0c;發現(ARCamera對象的相機內參) getImageDimensions()返回的圖像尺寸的width和height都為0。 這…

Kong api網關實戰教程

1. kong介紹 Kong是一款基于OpenResty(NginxLua模塊)編寫的高可用、易擴展的&#xff0c;由Mashape公司開源的API Gateway項目。Kong是基于NGINX和Apache Cassandra或PostgresQL構建的&#xff0c;能據供易于使用的RSTTAP[來操作和配置API管理系統&#xff0c;所以它可以水平擴…

【上】王樹森《小紅書推薦系統公開課》- 課程筆記(推薦系統基礎、召回、排序)

寫在前面 本文為王樹森老師《小紅書推薦系統公開課》的課程筆記 課程來源&#xff1a;ShusenWang的個人空間-ShusenWang個人主頁-嗶哩嗶哩視頻 (bilibili.com)課程資料&#xff1a;GitHub - wangshusen/RecommenderSystem 由于篇幅較長&#xff0c;分為【上】【下】兩篇文章…

C#中的比較和邏輯運算符

在C#編程中&#xff0c;比較和邏輯運算符是控制程序流程和執行條件判斷的重要工具。以下是C#中一些常用的比較和邏輯運算符及其示例。 相等運算符 運算符用于比較兩個值是否相等。如果相等&#xff0c;返回 true&#xff1b;否則返回 false。 示例 int a 5, b 5; bool is…

【busybox記錄】【shell指令】unlink

目錄 內容來源&#xff1a; 【GUN】【unlink】指令介紹 【busybox】【unlink】指令介紹 【linux】【unlink】指令介紹 使用示例&#xff1a; 刪除文件 - 默認 常用組合指令&#xff1a; 指令不常用/組合用法還需繼續挖掘&#xff1a; 內容來源&#xff1a; GUN &#x…

深入解析Web前端三大主流框架:Angular、React和Vue

Web前端三大主流框架分別是Angular、React和Vue。下面我將為您詳細介紹這三大框架的特點和使用指南。 Angular 核心概念: 組件(Components): 組件是Angular應用的構建塊,每個組件由一個帶有裝飾器的類、一個HTML模板、一個CSS樣式表組成。組件通過輸入(@Input)和輸出(…