Hey guys,
I was playing around with date picker so I could create a quick program to calculate the time until a future date for my 7 year old daughter. She always asks us “how long until my birthday??” So I made her a program that will tell her the Days, Hours, Minutes, Seconds until the date she selected in the ui.DatePicker.
Currently, she selects a date and it outputs the delta into a textView(4 of them, one for each: D,H,M,S), which get updated in real-time (Spams the terminal if debug flag is true, but I’m cool with that).
What I would like to do is replace the textViews with another DatePicker.
Unfortunately, none of the modes available display all fields: D,H,M,S.
Is there a way for me to do this?
Ideally, I’d like a copy of the source code for DatePicker so I could resize the width of the segments to be smaller(so it all fits) and then create additional segments to display D,H,M,S and rotate each dial in real-time.
Here is my working code as of right now:
import ui
import console
import time
import datetime
from time import *
from objc_util import *
from datetime import timedelta#, datetime
def run_async(func):
from threading import Thread
from functools import wraps
@wraps(func)
def async_func(*args, **kwargs):
func_hl = Thread(target = func, args = args, kwargs = kwargs)
func_hl.start()
return func_hl
return async_func
birthday = [2021, 2, 21]
# TODO: ##### MAIN VIEW #####
birthdayView = ui.View()
birthdayView.background_color = 'black'
birthdayView.x = 0
birthdayView.y = 0
birthdayView.width = 100
birthdayView.height = 100
birthdayView.flex = "LRTB"
#########################
# TODO: ##### DATE PICKER #####
dateSelector = ui.DatePicker()
dateSelector.center = (birthdayView.width / 2, birthdayView.height / 2)
dateSelector.x = birthdayView.center[0]
dateSelector.y = birthdayView.center[1]
dateSelector.background_color = "#AAA"
dateSelector.mode = 1
#########################
# TODO: ##### DAYS OUTPUT FIELD #####
daysOutputField = ui.TextView()
daysOutputField.x = birthdayView.center[0] - 15
daysOutputField.y = birthdayView.center[1] + 300
daysOutputField.width = 350
daysOutputField.height = 50
daysOutputField.background_color = "#000"
daysOutputField.text_color = "#F00"
daysOutputField.font = "<system>", 18
#########################
# TODO: ##### HOURS OUTPUT FIELD #####
hoursOutputField = ui.TextView()
hoursOutputField.x = birthdayView.center[0] - 15
hoursOutputField.y = birthdayView.center[1] + 355
hoursOutputField.width = 350
hoursOutputField.height = 50
hoursOutputField.background_color = "#000"
hoursOutputField.text_color = "#F00"
hoursOutputField.font = "<system>", 22
#########################
# TODO: ##### MINUTES OUTPUT FIELD #####
minutesOutputField = ui.TextView()
minutesOutputField.x = birthdayView.center[0] - 15
minutesOutputField.y = birthdayView.center[1] + 410
minutesOutputField.width = 350
minutesOutputField.height = 50
minutesOutputField.background_color = "#000"
minutesOutputField.text_color = "#F00"
minutesOutputField.font = "<system>", 26
#########################
# TODO: ##### SECONDS OUTPUT FIELD #####
secondsOutputField = ui.TextView()
secondsOutputField.x = birthdayView.center[0] - 15
secondsOutputField.y = birthdayView.center[1] + 465
secondsOutputField.width = 350
secondsOutputField.height = 50
secondsOutputField.background_color = "#000"
secondsOutputField.text_color = "#F00"
secondsOutputField.font = "<system>", 30
#########################
#import datetime
#from time import localtime, time, gmtime, mktime, struct_time
# TODO: ##### DEBUG FLAG #####
debugMode = 1
#########################
@run_async
def calculateTimeUntilBirthday(sender):
global birthday
global dateSelector
global countdownTimer
global daysOutputField
global hoursOutputField
global minutesOutputField
global secondsOutputField
while birthdayView.on_screen:
currentTime = datetime.datetime.now()
birthdayTime = dateSelector.date.replace(hour = 0, minute = 0, second = 0)
birthdayString = f"{birthdayTime.month}/{birthdayTime.day}/{birthdayTime.year}"
timeUntilBirthday = (birthdayTime) - (currentTime)
seconds = timeUntilBirthday.seconds
hours = seconds / 3600
minutesLeft = hours - int(hours)
minutesLeftMinutes = minutesLeft * 60
secondsLeft = minutesLeftMinutes - int(minutesLeftMinutes)
secondsLeftSeconds = secondsLeft * 60
secondsLeftSeconds = round(secondsLeftSeconds, 2)
daysOutput = f"Days: {timeUntilBirthday.days}"
daysOutputField.text = daysOutput
hoursOutput = f"Hours: {int(hours)}"
hoursOutputField.text = hoursOutput
minutesOutput = f"Minutes: {int(minutesLeftMinutes)}"
minutesOutputField.text = minutesOutput
secondsOutput = f"Seconds: {int(secondsLeftSeconds)}"
secondsOutputField.text = secondsOutput
if debugMode:
print(f"Current Time: {currentTime}")
print(f"Birthday Time: {birthdayTime}")
print(f"birthdayString: {birthdayString}")
print(f"timeUntilBirthday: {timeUntilBirthday}")
print(f"seconds: {seconds}")
print(f"hours: {hours}")
print(f"minutesLeft: {minutesLeft}")
print(f"minutesLeftMinutes: {minutesLeftMinutes}")
print(f"secondsLeft: {secondsLeft}")
print(f"secondsLeftSeconds: {secondsLeftSeconds}")
print(f"secondsLeftSeconds: {secondsLeftSeconds}")
print(f"Time Until Birthday: {birthdayString}\n Days: {timeUntilBirthday.days}\n Hours: {int(hours)}\n Minutes: {int(minutesLeftMinutes)}\n Seconds: {int(secondsLeftSeconds)}")
#birthdayView.add_subview(countdownTimer)
birthdayView.add_subview(dateSelector)
birthdayView.add_subview(daysOutputField)
birthdayView.add_subview(hoursOutputField)
birthdayView.add_subview(minutesOutputField)
birthdayView.add_subview(secondsOutputField)
dateSelector.action = calculateTimeUntilBirthday
birthdayView.present(hide_title_bar = True)
