Mucho Posted September 15, 2019 Share Posted September 15, 2019 I got this countdown timer script and I am trying to improve on it by adding the minutes and seconds entries to show the expected time when the countdown reaches 0. expandcollapse popup#include <GUIConstants.au3> #include <Date.au3> Global $Secs, $Mins, $Hour, $Time, $InitialT, $TargetT GUICreate("Timer", 200, 150) $MinIn = GUICtrlCreateInput("000", 70, 10, 30, 20, $ES_NUMBER) $label = GUICtrlCreateLabel(":", 101, 12) $SecIn = GUICtrlCreateInput("00", 105, 10, 30, 20, $ES_NUMBER) $start = GUICtrlCreateButton("Start", 75, 50, 50, 30) $timeLabel = GUICtrlCreateLabel("00:00:00", 80, 20) $EndTime = GUICtrlCreateLabel("End Time :", 35, 100, 70, 30) GUICtrlSetState($timeLabel, $GUI_HIDE) GUISetState(@SW_SHOW) $started = 0 While 1 ;After every loop check if the user clicked something in the GUI window $msg = GUIGetMsg() Select ;Check if user clicked on the close button Case $msg = $GUI_EVENT_CLOSE ;Destroy the GUI including the controls GUIDelete() ExitLoop Case $msg = $start If GUICtrlRead($start) == "Start" Then StartTimer() Else StopTimer() EndIf EndSelect WEnd Exit Func StartTimer() GUICtrlSetData($start, "Stop") GUICtrlSetState($MinIn, $GUI_HIDE) GUICtrlSetState($label, $GUI_HIDE) GUICtrlSetState($SecIn, $GUI_HIDE) GUICtrlSetState($timeLabel, $GUI_SHOW) $InitialT = TimerInit() $TargetT = (GUICtrlRead($MinIn) * 60 + GUICtrlRead($SecIn)) *1000 AdlibRegister("Timer") EndFunc ;==>StartTimer Func StopTimer() GUICtrlSetData($start, "Start") GUICtrlSetState($MinIn, $GUI_SHOW) GUICtrlSetState($label, $GUI_SHOW) GUICtrlSetState($SecIn, $GUI_SHOW) GUICtrlSetState($timeLabel, $GUI_HIDE) AdlibUnregister() EndFunc ;==>StartTimer Func Timer() $TimeLeft = $TargetT - TimerDiff($InitialT) If $TimeLeft > 0 Then _TicksToTime(Int($TimeLeft), $Hour, $Mins, $Secs) ; save current time to be able to test and avoid flicker.. Local $sTime = $Time $Time = StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs) If $sTime <> $Time Then GUICtrlSetData($timeLabel, $Time) Else ; Do something here StopTimer() EndIf EndFunc ;==>Timer I am not code savvy, but I need this function to work for me after I could not find any app on Googleplay that could fulfil my need. So I appreciate any help. Link to comment Share on other sites More sharing options...
Jfish Posted September 15, 2019 Share Posted September 15, 2019 You should look at the date functions. This can start you on your way ... shows projected date and time for the finish. expandcollapse popup#include <GUIConstants.au3> #include <Date.au3> Global $Secs, $Mins, $Hour, $Time, $InitialT, $TargetT GUICreate("Timer", 200, 150) $MinIn = GUICtrlCreateInput("000", 70, 10, 30, 20, $ES_NUMBER) $label = GUICtrlCreateLabel(":", 101, 12) $SecIn = GUICtrlCreateInput("00", 105, 10, 30, 20, $ES_NUMBER) $start = GUICtrlCreateButton("Start", 75, 50, 50, 30) $timeLabel = GUICtrlCreateLabel("00:00:00", 80, 20) $EndTime = GUICtrlCreateLabel("End Time :", 35, 100, 125, 30) GUICtrlSetState($timeLabel, $GUI_HIDE) GUISetState(@SW_SHOW) $started = 0 Func StartTimer() GUICtrlSetData($start, "Stop") GUICtrlSetState($MinIn, $GUI_HIDE) GUICtrlSetState($label, $GUI_HIDE) GUICtrlSetState($SecIn, $GUI_HIDE) GUICtrlSetState($timeLabel, $GUI_SHOW) $InitialT = TimerInit() $TargetT = (GUICtrlRead($MinIn) * 60 + GUICtrlRead($SecIn)) *1000 AdlibRegister("Timer") ;THIS IS THE PART THAT SHOWS THE PROJECTED FINISH $projectedFinish= round((($TargetT + TimerDiff($InitialT)))/1000,0) GUICtrlSetData($EndTime,"End Time : "& _DateAdd ( 's', $projectedFinish,_NowCalc())) EndFunc ;==>StartTimer Func StopTimer() GUICtrlSetData($start, "Start") GUICtrlSetState($MinIn, $GUI_SHOW) GUICtrlSetState($label, $GUI_SHOW) GUICtrlSetState($SecIn, $GUI_SHOW) GUICtrlSetState($timeLabel, $GUI_HIDE) AdlibUnregister() EndFunc ;==>StartTimer Func Timer() $TimeLeft = $TargetT - TimerDiff($InitialT) If $TimeLeft > 0 Then _TicksToTime(Int($TimeLeft), $Hour, $Mins, $Secs) ; save current time to be able to test and avoid flicker.. Local $sTime = $Time $Time = StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs) If $sTime <> $Time Then GUICtrlSetData($timeLabel, $Time) Else ; Do something here StopTimer() EndIf EndFunc ;==>Timer While 1 ;After every loop check if the user clicked something in the GUI window $msg = GUIGetMsg() Select ;Check if user clicked on the close button Case $msg = $GUI_EVENT_CLOSE ;Destroy the GUI including the controls GUIDelete() ExitLoop Case $msg = $start If GUICtrlRead($start) == "Start" Then StartTimer() Else StopTimer() EndIf EndSelect WEnd Mucho 1 Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt Link to comment Share on other sites More sharing options...
Mucho Posted September 16, 2019 Author Share Posted September 16, 2019 13 hours ago, Jfish said: You should look at the date functions. This can start you on your way projected date and time for the finish. That solves my problem. Thank you. Link to comment Share on other sites More sharing options...
Mucho Posted September 16, 2019 Author Share Posted September 16, 2019 (edited) @Jfish, I found that the following countdown timer code is more suitable for me as it allows for the input of hours, unlike the previous one. expandcollapse popup#NoTrayIcon #include <TrayConstants.au3> #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <Date.au3> #include <Sound.au3> Opt("MustDeclareVars", 1) ; removes the chance for misspelled variables causing bugs. Opt("TrayMenuMode", 3) ; The default tray menu items will not be shown and items are not checked when selected. These are options 1 and 2 for TrayMenuMode. Opt("TrayOnEventMode", 1) ; Enable TrayOnEventMode. Opt("GUIOnEventMode", 1) ; OnEvent functions notifications Global $seconds = 0, $g_sec, $g_min, $g_hr, $EndTime, $projectedFinish, $seconds, $T, $InitialT, $started = False, $sec = 99, $aTimeHold[3], $g_IsAlarm = 0, $iAppTitle, $sAppTitle = timerTitle() $iAppTitle = @extended #Region ### START Koda GUI section ### Form=\\WDMYCLOUDEX4100\Public\[FMIS]\au3_Shared_projects\timerThing.kxf Global $Form1 = GUICreate($sAppTitle, 245, 120, @DesktopWidth - 275 - (40 * $iAppTitle), 20 + (40 * $iAppTitle), -1, BitOR($WS_EX_TOPMOST, $WS_EX_WINDOWEDGE)) Global $idHour = GUICtrlCreateInput("00", 5, 4, 49, 32, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER)) Global $idMin = GUICtrlCreateInput("00", 58, 4, 49, 32, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER)) Global $idSec = GUICtrlCreateInput("00", 110, 4, 49, 32, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER)) Global $idStart = GUICtrlCreateButton("Start Timer", 163, 6, 75, 61, $BS_MULTILINE) Global $idTitle = GUICtrlCreateInput("", 4, 40, 129, 28, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_WANTRETURN)) Global $idAlarm = GUICtrlCreateCheckbox("", 137, 53, 17, 19, BitOR($GUI_SS_DEFAULT_CHECKBOX, $BS_RIGHTBUTTON)) Global $idInsist = GUICtrlCreateCheckbox("", 137, 37, 17, 19, BitOR($GUI_SS_DEFAULT_CHECKBOX, $BS_RIGHTBUTTON)) Global $idEndTime = GUICtrlCreateLabel("End Time :", 5, 90, 125, 30) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### GUICtrlSetFont($idHour, 14, 800) GUICtrlSetFont($idMin, 14, 800) GUICtrlSetFont($idSec, 14, 800) GUICtrlSetFont($idStart, 12, 800) GUICtrlSetFont($idTitle, 12, 800) GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close") GUICtrlSetOnEvent($idStart, "idStartClick") GUICtrlSetOnEvent($idTitle, "idTitleChange") GUICtrlSetOnEvent($idAlarm, "idAlarmEvent") TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "OnTray_PRIMARYDOUBLE") GUICtrlSetTip($idStart, 'press ENTER or click' & @CR & @CR & 'once started, on close,' & @CR & 'will move to the tray area.') GUICtrlSetTip($idHour, 'Hours' & @CR & @CR & 'enter the hours' & @CR & 'and press ENTER') GUICtrlSetTip($idMin, 'Minutes' & @CR & @CR & 'enter the minutes' & @CR & 'and press ENTER') GUICtrlSetTip($idSec, 'Seconds' & @CR & @CR & 'enter the seconds' & @CR & 'and press ENTER') GUICtrlSetTip($idTitle, 'Type a title for this' & @CR & 'timer and press ENTER') GUICtrlSetTip($idAlarm, 'Swap between' & @CR & 'Timer and Alarm' & @CR & 'functionality') GUICtrlSetTip($idInsist, 'Replay the alert' & @CR & 'every 10 sec.' & @CR & 'for 10 min.') ;~ If Not FileGetSize("timerThing.wav") Then FileInstall("timerThing.wav", "timerThing.wav") ; if you wanna include your WAV file Global $hForm1 = WinGetHandle($Form1) Global $idDummy = GUICtrlCreateDummy() Global $aAccelKeys[1][2] = [["{Enter}", $idDummy]] GUISetAccelerators($aAccelKeys) GUICtrlSetOnEvent($idDummy, "On_idDummy") While 1 Sleep(50) If Not $started Then ContinueLoop If $sec = @SEC Then ContinueLoop $sec = @SEC Countdown() WEnd Func Form1Close() If $started Then TraySetState(1) WinSetState($hForm1, "", @SW_HIDE) Else GUIDelete() Exit EndIf EndFunc ;==>Form1Close Func Countdown() ; mod. from https://www.autoitscript.com/forum/topic/135227-simple-counter/?do=findComment&comment=950305 If $g_IsAlarm Then If Int(GUICtrlRead($idHour)) = Int(@HOUR) And Int(GUICtrlRead($idMin)) = Int(@MIN) And Int(GUICtrlRead($idSec)) = Int(@SEC) Then $seconds = -1 Else Return EndIf EndIf $g_sec = Mod($seconds, 60) $g_min = Mod($seconds / 60, 60) $g_hr = Floor($seconds / 60 ^ 2) If $seconds < -3 Then Return TrayToolTip() $seconds -= 1 If $seconds = -2 Then GUICtrlSetState($idInsist, $GUI_DISABLE) If GUICtrlRead($idInsist) = 1 Then $seconds = -5 InsistPlayTheWAV() AdlibRegister("InsistPlayTheWAV", 10000) Else playTheWAV() EndIf Return EndIf If $seconds < -1 Then Return GUICtrlSetData($idHour, StringFormat("%02i", $g_hr)) GUICtrlSetData($idMin, StringFormat("%02i", $g_min)) GUICtrlSetData($idSec, StringFormat("%02i", $g_sec)) EndFunc ;==>Countdown Func playTheWAV() OnTray_PRIMARYDOUBLE() WinActivate($hForm1) If Not FileGetSize(@ScriptDir & "\timerThing.wav") Then SoundSetWaveVolume(25) SoundPlay(@WindowsDir & "\media\tada.wav") Else SoundSetWaveVolume(5) SoundPlay(@ScriptDir & "\timerThing.wav") EndIf EndFunc ;==>playTheWAV Func InsistPlayTheWAV() Local Static $t = 0 If $t = 0 Then $t = TimerInit() playTheWAV() If TimerDiff($t) > 600000 Then AdlibUnRegister("InsistPlayTheWAV") $t = 0 EndIf EndFunc ;==>InsistPlayTheWAV Func TrayToolTip() Local $title = $sAppTitle If GUICtrlRead($idTitle) Then $title = GUICtrlRead($idTitle) TraySetToolTip('' & _ $title & @CR & _ GUICtrlRead($idHour) & ":" & GUICtrlRead($idMin) & ":" & GUICtrlRead($idSec) & @CR & @CR & _ 'Double' & @CR & _ 'Click to' & @CR & _ 'restore' & @CR & @CR & ' ') EndFunc ;==>TrayToolTip Func idStartClick() Local $title = $sAppTitle If GUICtrlRead($idTitle) Then $title = GUICtrlRead($idTitle) WinSetTitle($hForm1, "", $title) $sec = 99 $started = Not $started Switch $started Case True GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "Start", "STOP")) $seconds = (Int(GUICtrlRead($idHour)) * 60 * 60) + (Int(GUICtrlRead($idMin)) * 60) + Int(GUICtrlRead($idSec)) $aTimeHold[0] = StringFormat("%02i", GUICtrlRead($idHour)) $aTimeHold[1] = StringFormat("%02i", GUICtrlRead($idMin)) $aTimeHold[2] = StringFormat("%02i", GUICtrlRead($idSec)) ; $InitialT = TimerInit() AdlibRegister("Timer") ;THIS IS THE PART THAT SHOWS THE PROJECTED FINISH $projectedFinish= round(($seconds + TimerDiff($InitialT)),0) GUICtrlSetData($idEndTime,"End Time : "& _DateAdd ( 's', $projectedFinish,_NowCalc())) GUICtrlSetState($idStart, $GUI_FOCUS) GUICtrlSetState($idHour, $GUI_DISABLE) GUICtrlSetState($idMin, $GUI_DISABLE) GUICtrlSetState($idSec, $GUI_DISABLE) GUICtrlSetState($idAlarm, $GUI_DISABLE) Case Else GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "STOP", "Start")) GUICtrlSetData($idHour, $aTimeHold[0]) GUICtrlSetData($idMin, $aTimeHold[1]) GUICtrlSetData($idSec, $aTimeHold[2]) GUICtrlSetState($idHour, $GUI_ENABLE) GUICtrlSetState($idMin, $GUI_ENABLE) GUICtrlSetState($idSec, $GUI_ENABLE) GUICtrlSetState($idAlarm, $GUI_ENABLE) GUICtrlSetState($idInsist, $GUI_ENABLE) GUICtrlSetState($idStart, $GUI_FOCUS) GUICtrlSetData($idEndTime, $GUI_ENABLE) EndSwitch AdlibUnRegister("Timer") EndFunc ;==>idStartClick Func On_idDummy() Local $i, $s = ControlGetFocus($hForm1) $i = Int(StringRight($s, 1)) If $s = "Button1" Then Return ControlClick($hForm1, "", "Button1") If StringInStr($s, "Edit") Then Switch $i Case 1, 2, 3 Send("{Tab}") EndSwitch EndIf EndFunc ;==>On_idDummy Func idTitleChange() Local $title = $sAppTitle If GUICtrlRead($idTitle) Then $title = GUICtrlRead($idTitle) WinSetTitle($hForm1, "", $title) EndFunc ;==>idTitleChange Func timerTitle() Local $n, $i = 0 For $n = 1 To 1000 If Not WinExists(" Timer thing [" & $n & "]") Then AutoItWinSetTitle(" Timer thing [" & $n & "]") $i = $n - 1 If 40 * $n > @DesktopHeight - 150 Then $i = 1 Return SetError(0, $i, " Timer " & $n) EndIf Next Return SetError(1, $i, " Timer ???") EndFunc ;==>timerTitle Func OnTray_PRIMARYDOUBLE() TraySetState(2) WinSetState($hForm1, "", @SW_SHOW) EndFunc ;==>OnTray_PRIMARYDOUBLE Func idAlarmEvent() ConsoleWrite('+ Func idAlarmEvent() : ' & GUICtrlRead($idAlarm) & @CRLF) If GUICtrlRead($idAlarm) = 1 Then $g_IsAlarm = 1 GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "Timer", "Alarm")) $sAppTitle = StringReplace($sAppTitle, "Timer", "Alarm") Else $g_IsAlarm = 0 GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "Alarm", "Timer")) $sAppTitle = StringReplace($sAppTitle, "Alarm", "Timer") EndIf idTitleChange() EndFunc ;==>idAlarmEvent However, if I clicked on 'Stop Timer', the 'End Time' is strangely replaced with '64'. How to correct the error? Edited September 16, 2019 by Mucho Link to comment Share on other sites More sharing options...
Jfish Posted September 16, 2019 Share Posted September 16, 2019 @Mucho - I suggest you do some debugging to study the values being produced. What have you tried so far? Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now