commit
e33cd9139c
135
PySimpleGUI.py
135
PySimpleGUI.py
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
version = __version__ = "4.18.0 Released 26 Mar 2020"
|
||||
version = __version__ = "4.18.0.2 Unreleased - Print and MLine.Print fixed sep char handling, popup_get_date"
|
||||
|
||||
port = 'PySimpleGUI'
|
||||
|
||||
|
@ -128,6 +128,8 @@ from math import fabs
|
|||
from functools import wraps
|
||||
from subprocess import run, PIPE
|
||||
from threading import Thread
|
||||
import calendar as cal
|
||||
import itertools
|
||||
import os
|
||||
|
||||
warnings.simplefilter('always', UserWarning)
|
||||
|
@ -11434,10 +11436,17 @@ class _DebugWin():
|
|||
event, values = self.window.Read(timeout=0)
|
||||
# print(f'Printing {ObjToStringSingleObj(self.output_element)}')
|
||||
if self.do_not_reroute_stdout:
|
||||
end_str = str(end) if end is not None else '\n'
|
||||
sep_str = str(sep) if sep is not None else ' '
|
||||
|
||||
outstring = ''
|
||||
for arg in args:
|
||||
outstring += str(arg) + sepchar
|
||||
outstring += endchar
|
||||
num_args = len(args)
|
||||
for i, arg in enumerate(args):
|
||||
outstring += str(arg)
|
||||
if i != num_args - 1:
|
||||
outstring += sep_str
|
||||
outstring += end_str
|
||||
|
||||
self.output_element.Update(outstring, append=True, text_color_for_value=text_color, background_color_for_value=background_color)
|
||||
else:
|
||||
print(*args, sep=sepchar, end=endchar)
|
||||
|
@ -11530,13 +11539,17 @@ def _print_to_element(multiline_element, *args, end=None, sep=None, text_color=N
|
|||
:param background_color: The background color of the line
|
||||
:type background_color: (str)
|
||||
"""
|
||||
sepchar = sep if sep is not None else ' '
|
||||
endchar = end if end is not None else '\n'
|
||||
end_str = str(end) if end is not None else '\n'
|
||||
sep_str = str(sep) if sep is not None else ' '
|
||||
|
||||
outstring = ''
|
||||
for arg in args:
|
||||
outstring += str(arg) + sepchar
|
||||
outstring += endchar
|
||||
num_args = len(args)
|
||||
for i, arg in enumerate(args):
|
||||
outstring += str(arg)
|
||||
if i != num_args-1:
|
||||
outstring += sep_str
|
||||
outstring += end_str
|
||||
|
||||
multiline_element.update(outstring, append=True, text_color_for_value=text_color, background_color_for_value=background_color)
|
||||
|
||||
|
||||
|
@ -14219,6 +14232,110 @@ def PopupGetText(message, title=None, default_text='', password_char='', size=(N
|
|||
return path
|
||||
|
||||
|
||||
|
||||
def popup_get_date(start_mon, start_day, start_year, begin_at_sunday_plus=0, location=(None, None)):
|
||||
"""
|
||||
Display a calendar window, get the user's choice, return as a tuple (mon, day, year)
|
||||
|
||||
:param start_mon: The starting month
|
||||
:type start_mon: int
|
||||
:param start_day: The starting day - optional. Set to 0 if no date to be chosen at start
|
||||
:type start_day: int
|
||||
:param start_year: The starting year
|
||||
:type start_year: int
|
||||
:param begin_at_sunday_plus: Determines the left-most day in the display. 0=sunday, 1=monday, etc
|
||||
:type begin_at_sunday_plus: int
|
||||
:return: Tuple containing (month, day, year) of chosen date or None if was cancelled
|
||||
:rtype: None or (int, int, int)
|
||||
"""
|
||||
|
||||
day_font = 'TkFixedFont 8'
|
||||
mon_year_font = 'TkFixedFont 10'
|
||||
arrow_font = 'TkFixedFont 8'
|
||||
|
||||
def update_days(window, month, year, begin_at_sunday_plus):
|
||||
[window[(week, day)].update('') for day in range(7) for week in range(6)]
|
||||
weeks = cal.monthcalendar(year, month)
|
||||
month_days = list(itertools.chain.from_iterable([[0 for _ in range(8 - begin_at_sunday_plus)]] + weeks))
|
||||
if month_days[6] == 0:
|
||||
month_days = month_days[7:]
|
||||
if month_days[6] == 0:
|
||||
month_days = month_days[7:]
|
||||
for i, day in enumerate(month_days):
|
||||
offset = i
|
||||
if offset >= 6 * 7:
|
||||
break
|
||||
window[(offset // 7, offset % 7)].update(str(day) if day else '')
|
||||
|
||||
def make_days_layout():
|
||||
days_layout = []
|
||||
for week in range(6):
|
||||
row = []
|
||||
for day in range(7):
|
||||
row.append(T('', size=(4, 1), justification='c', font=day_font, key=(week, day), enable_events=True, pad=(0, 0)))
|
||||
days_layout.append(row)
|
||||
return days_layout
|
||||
|
||||
cur_month = start_mon
|
||||
cur_year = start_year
|
||||
cur_day = start_day
|
||||
|
||||
days_layout = make_days_layout()
|
||||
|
||||
layout = [[B('◄', font=arrow_font, border_width=0, key='-MON-DOWN-'),
|
||||
Text('{} {}'.format(cal.month_name[cur_month], cur_year), size=(16,1), justification='c', font=mon_year_font, key='-MON-YEAR-'),
|
||||
B('►', font=arrow_font,border_width=0, key='-MON-UP-')]]
|
||||
layout += [[Col([[T(cal.day_abbr[i - (8 - begin_at_sunday_plus) % 7], size=(4,1), font=day_font, background_color=theme_text_color(), text_color=theme_background_color(), pad=(0,0)) for i in range(7)]], background_color=theme_text_color(), pad=(0,0))]]
|
||||
layout += days_layout
|
||||
layout += [[Button('Ok', border_width=0,font='TkFixedFont 8'), Button('Cancel',border_width=0, font='TkFixedFont 8')]]
|
||||
|
||||
window = Window('Window Title', layout, no_titlebar=True, grab_anywhere=True, keep_on_top=True, font='TkFixedFont 12', use_default_focus=False, location=location, finalize=True)
|
||||
|
||||
update_days(window, cur_month, cur_year, begin_at_sunday_plus)
|
||||
|
||||
prev_choice = chosen_mon_day_year = None
|
||||
|
||||
if cur_day:
|
||||
chosen_mon_day_year = cur_month, cur_day, cur_year
|
||||
for week in range(6):
|
||||
for day in range(7):
|
||||
if window[(week,day)].DisplayText == str(cur_day):
|
||||
window[(week,day)].update(background_color=theme_text_color(), text_color=theme_background_color())
|
||||
prev_choice = (week,day)
|
||||
break
|
||||
|
||||
while True: # Event Loop
|
||||
event, values = window.read()
|
||||
if event in (None, 'Cancel'):
|
||||
chosen_mon_day_year = None
|
||||
break
|
||||
if event == 'Ok':
|
||||
break
|
||||
if event in ('-MON-UP-', '-MON-DOWN-'):
|
||||
cur_month += 1 if event == '-MON-UP-' else -1
|
||||
if cur_month > 12:
|
||||
cur_month = 1
|
||||
cur_year += 1
|
||||
elif cur_month < 1:
|
||||
cur_month = 12
|
||||
cur_year -= 1
|
||||
window['-MON-YEAR-'].update('{} {}'.format(cal.month_name[cur_month], cur_year))
|
||||
update_days(window, cur_month, cur_year, begin_at_sunday_plus)
|
||||
if prev_choice:
|
||||
window[prev_choice].update(background_color=theme_background_color(), text_color=theme_text_color())
|
||||
elif type(event) is tuple:
|
||||
if window[event].DisplayText != "":
|
||||
chosen_mon_day_year = cur_month, int(window[event].DisplayText), cur_year
|
||||
if prev_choice:
|
||||
window[prev_choice].update(background_color=theme_background_color(), text_color=theme_text_color())
|
||||
window[event].update(background_color=theme_text_color(), text_color=theme_background_color())
|
||||
prev_choice = event
|
||||
window.close()
|
||||
return chosen_mon_day_year
|
||||
|
||||
|
||||
|
||||
|
||||
# --------------------------- PopupAnimated ---------------------------
|
||||
|
||||
def PopupAnimated(image_source, message=None, background_color=None, text_color=None, font=None, no_titlebar=True, grab_anywhere=True, keep_on_top=True, location=(None, None), alpha_channel=None, time_between_frames=0, transparent_color=None, title=''):
|
||||
|
|
Loading…
Reference in New Issue