Skip to content

Commit 81dd6db

Browse files
committed
Dates - simple date manipulation
A simple date manipulation script to showcase PySimpleGUI
1 parent c7fdde6 commit 81dd6db

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

GUI/Dates/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Dates is a simple script to demonstrate both the use of PySimpleGUI as an interface to python scripts,
2+
and basic date manipulation.
3+
4+
It requires PySimpleGUI==4.60.1
5+
6+
Tested on Python 3.10
7+
8+
9+
Eduardo C. (https://github.com/ehcelino)

GUI/Dates/main.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
"""
2+
Dates - a simple graphic dates calculator
3+
Demonstrates the use of PySimpleGui as an interface
4+
and date arithmetics using module datetime and numpy.
5+
"""
6+
from datetime import datetime
7+
import PySimpleGUI as sg
8+
import numpy as np
9+
10+
DATE_FRMT = '%m-%d-%Y'
11+
12+
def days_between(date_one, date_two):
13+
"""
14+
Determines how many days between dates.
15+
:param date_one: date (us format) as string
16+
:param date_two: date (us format) as string
17+
:return: days as string
18+
"""
19+
result = ''
20+
try:
21+
tmp_one = datetime.strptime(date_one, DATE_FRMT)
22+
tmp_two = datetime.strptime(date_two, DATE_FRMT)
23+
except ValueError as exc:
24+
sg.popup('Error:', exc)
25+
else:
26+
mytimedelta = tmp_one - tmp_two
27+
result = mytimedelta.days
28+
return result
29+
30+
def workdays_between(date_one, date_two):
31+
"""
32+
Determines how many workdays between dates.
33+
:param date_one: date (us format) as string
34+
:param date_two: date (us format) as string
35+
:return: days as int
36+
"""
37+
result = ''
38+
try:
39+
tmp_one = datetime.strptime(date_one, DATE_FRMT)
40+
tmp_two = datetime.strptime(date_two, DATE_FRMT)
41+
except ValueError as exc:
42+
sg.popup('Error:', exc)
43+
else:
44+
result = np.busday_count(tmp_one.strftime('%Y-%m-%d'), tmp_two.strftime('%Y-%m-%d'))
45+
return result
46+
47+
def main_window():
48+
"""
49+
Defines the main window.
50+
:return: PySimpleGUI Window object.
51+
"""
52+
tsz = (8, 1) # Makes easier to define sizes to multiple elements.
53+
isz = (15, 1)
54+
# Everything bound by []'s goes on one line.
55+
layout = [
56+
[sg.Text('Date calculator', font='_ 12 bold')],
57+
[sg.Text('Date format: US (mm-dd-yyyy', font='_ 10 italic')],
58+
[sg.Text('Date one:', size=tsz),
59+
sg.Input('', size=isz, key='-DATE01-')],
60+
[sg.Text('Date two:', size=tsz),
61+
sg.Input('', size=isz, key='-DATE02-')],
62+
[sg.Text('Answer:', size=tsz),
63+
sg.Input('', size=isz, key='-OUTPUT-')],
64+
[sg.Push(), sg.Button('Days between dates', key='-BETWEEN-'), sg.Push()],
65+
[sg.Push(), sg.Button('Working days bt. dates', key='-WORKING-'), sg.Push()],
66+
[sg.Push(), sg.Button('Exit', key='-EXIT-')]
67+
]
68+
69+
return sg.Window('Date calculator!', layout, finalize=True)
70+
71+
window = main_window()
72+
73+
while True: # This is the main loop.
74+
event, values = window.read()
75+
76+
if event == '-BETWEEN-':
77+
try:
78+
window['-OUTPUT-'].update(value=str(abs(
79+
days_between(values['-DATE01-'], values['-DATE02-']))))
80+
except TypeError as err:
81+
sg.popup('Error:', err)
82+
83+
if event == '-WORKING-':
84+
try:
85+
window['-OUTPUT-'].update(value=str(abs(
86+
workdays_between(values['-DATE01-'], values['-DATE02-']))))
87+
except TypeError as err:
88+
sg.popup('Error:', err)
89+
90+
if event in (sg.WIN_CLOSED, '-EXIT-'):
91+
break
92+
93+
window.close()

0 commit comments

Comments
 (0)