commit
25f236a8f4
|
@ -1,9 +1,10 @@
|
||||||
import PySimpleGUI as sg
|
import PySimpleGUI as sg
|
||||||
|
|
||||||
layout = [[sg.T('Calendar Test')],
|
layout = [[sg.T('Calendar Test')],
|
||||||
[sg.CalendarButton('Choose Date', key='date')],
|
[sg.In('', size=(20,1))],
|
||||||
|
[sg.CalendarButton('Choose Date', target=(1,0), key='date')],
|
||||||
[sg.Ok(key=1)]]
|
[sg.Ok(key=1)]]
|
||||||
|
|
||||||
form = sg.FlexForm('Calendar')
|
form = sg.FlexForm('Calendar', no_titlebar=True)
|
||||||
b,v = form.LayoutAndRead(layout)
|
b,v = form.LayoutAndRead(layout)
|
||||||
sg.Popup(v['date'])
|
sg.Popup(v['date'])
|
||||||
|
|
|
@ -11,6 +11,8 @@ import pickle
|
||||||
import calendar
|
import calendar
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ----====----====----==== Constants the user CAN safely change ====----====----====----#
|
# ----====----====----==== Constants the user CAN safely change ====----====----====----#
|
||||||
DEFAULT_WINDOW_ICON = 'default_icon.ico'
|
DEFAULT_WINDOW_ICON = 'default_icon.ico'
|
||||||
DEFAULT_ELEMENT_SIZE = (45,1) # In CHARACTERS
|
DEFAULT_ELEMENT_SIZE = (45,1) # In CHARACTERS
|
||||||
|
@ -820,6 +822,7 @@ class Button(Element):
|
||||||
# Buttons modify targets or return from the form
|
# Buttons modify targets or return from the form
|
||||||
# If modifying target, get the element object at the target and modify its StrVar
|
# If modifying target, get the element object at the target and modify its StrVar
|
||||||
target = self.Target
|
target = self.Target
|
||||||
|
target_element = None
|
||||||
if target[0] == ThisRow:
|
if target[0] == ThisRow:
|
||||||
target = [self.Position[0], target[1]]
|
target = [self.Position[0], target[1]]
|
||||||
if target[1] < 0:
|
if target[1] < 0:
|
||||||
|
@ -887,7 +890,7 @@ class Button(Element):
|
||||||
elif self.BType == BUTTON_TYPE_CALENDAR_CHOOSER: # this is a return type button so GET RESULTS and destroy window
|
elif self.BType == BUTTON_TYPE_CALENDAR_CHOOSER: # this is a return type button so GET RESULTS and destroy window
|
||||||
root = tk.Toplevel()
|
root = tk.Toplevel()
|
||||||
root.title('Calendar Chooser')
|
root.title('Calendar Chooser')
|
||||||
self.TKCal = TKCalendar(master=root, firstweekday=calendar.SUNDAY)
|
self.TKCal = TKCalendar(master=root, firstweekday=calendar.SUNDAY, target_element=target_element)
|
||||||
self.TKCal.pack(expand=1, fill='both')
|
self.TKCal.pack(expand=1, fill='both')
|
||||||
# self.ParentForm.TKRroot.mainloop()
|
# self.ParentForm.TKRroot.mainloop()
|
||||||
root.update()
|
root.update()
|
||||||
|
@ -1207,13 +1210,14 @@ class TKCalendar(ttk.Frame):
|
||||||
datetime = calendar.datetime.datetime
|
datetime = calendar.datetime.datetime
|
||||||
timedelta = calendar.datetime.timedelta
|
timedelta = calendar.datetime.timedelta
|
||||||
|
|
||||||
def __init__(self, master=None, **kw):
|
def __init__(self, master=None, target_element=None, **kw):
|
||||||
"""
|
"""
|
||||||
WIDGET-SPECIFIC OPTIONS
|
WIDGET-SPECIFIC OPTIONS
|
||||||
|
|
||||||
locale, firstweekday, year, month, selectbackground,
|
locale, firstweekday, year, month, selectbackground,
|
||||||
selectforeground
|
selectforeground
|
||||||
"""
|
"""
|
||||||
|
self._TargetElement = target_element
|
||||||
# remove custom options from kw before initializating ttk.Frame
|
# remove custom options from kw before initializating ttk.Frame
|
||||||
fwday = kw.pop('firstweekday', calendar.MONDAY)
|
fwday = kw.pop('firstweekday', calendar.MONDAY)
|
||||||
year = kw.pop('year', self.datetime.now().year)
|
year = kw.pop('year', self.datetime.now().year)
|
||||||
|
@ -1224,7 +1228,6 @@ class TKCalendar(ttk.Frame):
|
||||||
|
|
||||||
self._date = self.datetime(year, month, 1)
|
self._date = self.datetime(year, month, 1)
|
||||||
self._selection = None # no date selected
|
self._selection = None # no date selected
|
||||||
|
|
||||||
ttk.Frame.__init__(self, master, **kw)
|
ttk.Frame.__init__(self, master, **kw)
|
||||||
|
|
||||||
# instantiate proper calendar class
|
# instantiate proper calendar class
|
||||||
|
@ -1372,6 +1375,10 @@ class TKCalendar(ttk.Frame):
|
||||||
text = '%02d' % text
|
text = '%02d' % text
|
||||||
self._selection = (text, item, column)
|
self._selection = (text, item, column)
|
||||||
self._show_selection(text, bbox)
|
self._show_selection(text, bbox)
|
||||||
|
year, month = self._date.year, self._date.month
|
||||||
|
try:
|
||||||
|
self._TargetElement.Update(self.datetime(year, month, int(self._selection[0])))
|
||||||
|
except: pass
|
||||||
|
|
||||||
def _prev_month(self):
|
def _prev_month(self):
|
||||||
"""Updated calendar to show the previous month."""
|
"""Updated calendar to show the previous month."""
|
||||||
|
@ -1413,7 +1420,7 @@ class FlexForm:
|
||||||
'''
|
'''
|
||||||
Display a user defined for and return the filled in data
|
Display a user defined for and return the filled in data
|
||||||
'''
|
'''
|
||||||
def __init__(self, title, default_element_size=DEFAULT_ELEMENT_SIZE, default_button_element_size = (None, None), auto_size_text=None, auto_size_buttons=None, scale=(None, None), location=(None, None), button_color=None, font=None, progress_bar_color=(None, None), background_color=None, is_tabbed_form=False, border_depth=None, auto_close=False, auto_close_duration=DEFAULT_AUTOCLOSE_TIME, icon=DEFAULT_WINDOW_ICON, return_keyboard_events=False, use_default_focus=True, text_justification=None):
|
def __init__(self, title, default_element_size=DEFAULT_ELEMENT_SIZE, default_button_element_size = (None, None), auto_size_text=None, auto_size_buttons=None, scale=(None, None), location=(None, None), button_color=None, font=None, progress_bar_color=(None, None), background_color=None, is_tabbed_form=False, border_depth=None, auto_close=False, auto_close_duration=DEFAULT_AUTOCLOSE_TIME, icon=DEFAULT_WINDOW_ICON, return_keyboard_events=False, use_default_focus=True, text_justification=None, no_titlebar=False):
|
||||||
self.AutoSizeText = auto_size_text if auto_size_text is not None else DEFAULT_AUTOSIZE_TEXT
|
self.AutoSizeText = auto_size_text if auto_size_text is not None else DEFAULT_AUTOSIZE_TEXT
|
||||||
self.AutoSizeButtons = auto_size_buttons if auto_size_buttons is not None else DEFAULT_AUTOSIZE_BUTTONS
|
self.AutoSizeButtons = auto_size_buttons if auto_size_buttons is not None else DEFAULT_AUTOSIZE_BUTTONS
|
||||||
self.Title = title
|
self.Title = title
|
||||||
|
@ -1453,6 +1460,7 @@ class FlexForm:
|
||||||
self.ReturnKeyboardEvents = return_keyboard_events
|
self.ReturnKeyboardEvents = return_keyboard_events
|
||||||
self.LastKeyboardEvent = None
|
self.LastKeyboardEvent = None
|
||||||
self.TextJustification = text_justification
|
self.TextJustification = text_justification
|
||||||
|
self.NoTitleBar = no_titlebar
|
||||||
|
|
||||||
# ------------------------- Add ONE Row to Form ------------------------- #
|
# ------------------------- Add ONE Row to Form ------------------------- #
|
||||||
def AddRow(self, *args):
|
def AddRow(self, *args):
|
||||||
|
@ -1839,8 +1847,8 @@ def RealtimeButton(button_text, image_filename=None, image_size=(None, None),ima
|
||||||
def DummyButton(button_text, image_filename=None, image_size=(None, None),image_subsample=None,border_width=None,scale=(None, None), size=(None, None), auto_size_button=None, button_color=None, font=None, bind_return_key=False, focus=False, pad=None, key=None):
|
def DummyButton(button_text, image_filename=None, image_size=(None, None),image_subsample=None,border_width=None,scale=(None, None), size=(None, None), auto_size_button=None, button_color=None, font=None, bind_return_key=False, focus=False, pad=None, key=None):
|
||||||
return Button(BUTTON_TYPE_CLOSES_WIN_ONLY, image_filename=image_filename, image_size=image_size, image_subsample=image_subsample, border_width=border_width, button_text=button_text, scale=scale, size=size, auto_size_button=auto_size_button, button_color=button_color, font=font, bind_return_key=bind_return_key, focus=focus, pad=pad, key=key)
|
return Button(BUTTON_TYPE_CLOSES_WIN_ONLY, image_filename=image_filename, image_size=image_size, image_subsample=image_subsample, border_width=border_width, button_text=button_text, scale=scale, size=size, auto_size_button=auto_size_button, button_color=button_color, font=font, bind_return_key=bind_return_key, focus=focus, pad=pad, key=key)
|
||||||
# ------------------------- GENERIC BUTTON Element lazy function ------------------------- #
|
# ------------------------- GENERIC BUTTON Element lazy function ------------------------- #
|
||||||
def CalendarButton(button_text, image_filename=None, image_size=(None, None), image_subsample=None, border_width=None, scale=(None, None), size=(None, None), auto_size_button=None, button_color=None, font=None, bind_return_key=False, focus=False, pad=None, key=None):
|
def CalendarButton(button_text, target=(None,None), image_filename=None, image_size=(None, None), image_subsample=None, border_width=None, scale=(None, None), size=(None, None), auto_size_button=None, button_color=None, font=None, bind_return_key=False, focus=False, pad=None, key=None):
|
||||||
return Button(BUTTON_TYPE_CALENDAR_CHOOSER, image_filename=image_filename, image_size=image_size, image_subsample=image_subsample, button_text=button_text, border_width=border_width, scale=scale, size=size, auto_size_button=auto_size_button, button_color=button_color, font=font, bind_return_key=bind_return_key, focus=focus, pad=pad, key=key)
|
return Button(BUTTON_TYPE_CALENDAR_CHOOSER, target=target, image_filename=image_filename, image_size=image_size, image_subsample=image_subsample, button_text=button_text, border_width=border_width, scale=scale, size=size, auto_size_button=auto_size_button, button_color=button_color, font=font, bind_return_key=bind_return_key, focus=focus, pad=pad, key=key)
|
||||||
##################################### ----- RESULTS ------ ##################################################
|
##################################### ----- RESULTS ------ ##################################################
|
||||||
|
|
||||||
def AddToReturnDictionary(form, element, value):
|
def AddToReturnDictionary(form, element, value):
|
||||||
|
@ -2484,7 +2492,8 @@ def ConvertFlexToTK(MyFlexForm):
|
||||||
master.title(MyFlexForm.Title)
|
master.title(MyFlexForm.Title)
|
||||||
InitializeResults(MyFlexForm)
|
InitializeResults(MyFlexForm)
|
||||||
try:
|
try:
|
||||||
master.attributes('-alpha', 0) # hide window while building it. makes for smoother 'paint'
|
if MyFlexForm.NoTitleBar:
|
||||||
|
MyFlexForm.TKroot.wm_overrideredirect(True)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
PackFormIntoFrame(MyFlexForm, master, MyFlexForm)
|
PackFormIntoFrame(MyFlexForm, master, MyFlexForm)
|
||||||
|
@ -2510,13 +2519,12 @@ def ConvertFlexToTK(MyFlexForm):
|
||||||
|
|
||||||
move_string = '+%i+%i'%(int(x),int(y))
|
move_string = '+%i+%i'%(int(x),int(y))
|
||||||
master.geometry(move_string)
|
master.geometry(move_string)
|
||||||
master.attributes('-alpha', 255) # Make window visible again
|
|
||||||
master.update_idletasks() # don't forget
|
master.update_idletasks() # don't forget
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
# ----====----====----====----====----==== STARTUP TK ====----====----====----====----====----#
|
# ----====----====----====----====----==== STARTUP TK ====----====----====----====----====----#
|
||||||
def ShowTabbedForm(title, *args, auto_close=False, auto_close_duration=DEFAULT_AUTOCLOSE_TIME, fav_icon=DEFAULT_WINDOW_ICON):
|
def ShowTabbedForm(title, *args, auto_close=False, auto_close_duration=DEFAULT_AUTOCLOSE_TIME, fav_icon=DEFAULT_WINDOW_ICON, no_titlebar=False):
|
||||||
# takes as input (form, rows, tab name) for each tab
|
# takes as input (form, rows, tab name) for each tab
|
||||||
global _my_windows
|
global _my_windows
|
||||||
|
|
||||||
|
@ -2525,6 +2533,11 @@ def ShowTabbedForm(title, *args, auto_close=False, auto_close_duration=DEFAULT_A
|
||||||
uber.TKroot = root
|
uber.TKroot = root
|
||||||
if title is not None:
|
if title is not None:
|
||||||
root.title(title)
|
root.title(title)
|
||||||
|
try:
|
||||||
|
root.attributes('-alpha', 0) # hide window while building it. makes for smoother 'paint'
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
if not len(args):
|
if not len(args):
|
||||||
print('******************* SHOW TABBED FORMS ERROR .... no arguments')
|
print('******************* SHOW TABBED FORMS ERROR .... no arguments')
|
||||||
return
|
return
|
||||||
|
@ -2540,6 +2553,7 @@ def ShowTabbedForm(title, *args, auto_close=False, auto_close_duration=DEFAULT_A
|
||||||
# ATTENTION: this applies the new style 'combostyle' to all ttk.Combobox
|
# ATTENTION: this applies the new style 'combostyle' to all ttk.Combobox
|
||||||
# framestyle.theme_use('framestyle')
|
# framestyle.theme_use('framestyle')
|
||||||
tab_control = ttk.Notebook(root)
|
tab_control = ttk.Notebook(root)
|
||||||
|
|
||||||
for num,x in enumerate(args):
|
for num,x in enumerate(args):
|
||||||
form, rows, tab_name = x
|
form, rows, tab_name = x
|
||||||
form.AddRows(rows)
|
form.AddRows(rows)
|
||||||
|
@ -2565,7 +2579,16 @@ def ShowTabbedForm(title, *args, auto_close=False, auto_close_duration=DEFAULT_A
|
||||||
icon = fav_icon if not _my_windows.user_defined_icon else _my_windows.user_defined_icon
|
icon = fav_icon if not _my_windows.user_defined_icon else _my_windows.user_defined_icon
|
||||||
try: uber.TKroot.iconbitmap(icon)
|
try: uber.TKroot.iconbitmap(icon)
|
||||||
except: pass
|
except: pass
|
||||||
|
try:
|
||||||
|
if no_titlebar:
|
||||||
|
uber.TKroot.wm_overrideredirect(True)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
root.attributes('-alpha', 255) # hide window while building it. makes for smoother 'paint'
|
||||||
|
except:
|
||||||
|
pass
|
||||||
root.mainloop()
|
root.mainloop()
|
||||||
|
|
||||||
if id: root.after_cancel(id)
|
if id: root.after_cancel(id)
|
||||||
|
@ -2579,7 +2602,11 @@ def StartupTK(my_flex_form):
|
||||||
ow = _my_windows.NumOpenWindows
|
ow = _my_windows.NumOpenWindows
|
||||||
# print('Starting TK open Windows = {}'.format(ow))
|
# print('Starting TK open Windows = {}'.format(ow))
|
||||||
root = tk.Tk() if not ow else tk.Toplevel()
|
root = tk.Tk() if not ow else tk.Toplevel()
|
||||||
# root = tk.Toplevel()
|
try:
|
||||||
|
root.attributes('-alpha', 0) # hide window while building it. makes for smoother 'paint'
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
# root.wm_overrideredirect(True)
|
||||||
if my_flex_form.BackgroundColor is not None and my_flex_form.BackgroundColor != COLOR_SYSTEM_DEFAULT:
|
if my_flex_form.BackgroundColor is not None and my_flex_form.BackgroundColor != COLOR_SYSTEM_DEFAULT:
|
||||||
root.configure(background=my_flex_form.BackgroundColor)
|
root.configure(background=my_flex_form.BackgroundColor)
|
||||||
_my_windows.Increment()
|
_my_windows.Increment()
|
||||||
|
@ -2589,6 +2616,12 @@ def StartupTK(my_flex_form):
|
||||||
# root.bind('<Destroy>', MyFlexForm.DestroyedCallback())
|
# root.bind('<Destroy>', MyFlexForm.DestroyedCallback())
|
||||||
ConvertFlexToTK(my_flex_form)
|
ConvertFlexToTK(my_flex_form)
|
||||||
my_flex_form.SetIcon(my_flex_form.WindowIcon)
|
my_flex_form.SetIcon(my_flex_form.WindowIcon)
|
||||||
|
|
||||||
|
try:
|
||||||
|
root.attributes('-alpha', 255) # hide window while building it. makes for smoother 'paint'
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
if my_flex_form.ReturnKeyboardEvents and not my_flex_form.NonBlocking:
|
if my_flex_form.ReturnKeyboardEvents and not my_flex_form.NonBlocking:
|
||||||
root.bind("<KeyRelease>", my_flex_form._KeyboardCallback)
|
root.bind("<KeyRelease>", my_flex_form._KeyboardCallback)
|
||||||
root.bind("<MouseWheel>", my_flex_form._MouseWheelCallback)
|
root.bind("<MouseWheel>", my_flex_form._MouseWheelCallback)
|
||||||
|
@ -2637,7 +2670,7 @@ def _GetNumLinesNeeded(text, max_line_width):
|
||||||
# Exits via an OK button2 press #
|
# Exits via an OK button2 press #
|
||||||
# Returns nothing #
|
# Returns nothing #
|
||||||
# ===================================================#
|
# ===================================================#
|
||||||
def Popup(*args, button_color=None, button_type=MSG_BOX_OK, auto_close=False, auto_close_duration=None, non_blocking=False, icon=DEFAULT_WINDOW_ICON, line_width=None, font=None):
|
def Popup(*args, button_color=None, button_type=MSG_BOX_OK, auto_close=False, auto_close_duration=None, non_blocking=False, icon=DEFAULT_WINDOW_ICON, line_width=None, font=None, no_titlebar=False):
|
||||||
'''
|
'''
|
||||||
Show message box. Displays one line per user supplied argument. Takes any Type of variable to display.
|
Show message box. Displays one line per user supplied argument. Takes any Type of variable to display.
|
||||||
:param args:
|
:param args:
|
||||||
|
@ -2659,7 +2692,7 @@ def Popup(*args, button_color=None, button_type=MSG_BOX_OK, auto_close=False, au
|
||||||
else:
|
else:
|
||||||
local_line_width = MESSAGE_BOX_LINE_WIDTH
|
local_line_width = MESSAGE_BOX_LINE_WIDTH
|
||||||
title = args_to_print[0] if args_to_print[0] is not None else 'None'
|
title = args_to_print[0] if args_to_print[0] is not None else 'None'
|
||||||
with FlexForm(title, auto_size_text=True, button_color=button_color, auto_close=auto_close, auto_close_duration=auto_close_duration, icon=icon, font=font) as form:
|
with FlexForm(title, auto_size_text=True, button_color=button_color, auto_close=auto_close, auto_close_duration=auto_close_duration, icon=icon, font=font, no_titlebar=no_titlebar) as form:
|
||||||
max_line_total, total_lines = 0,0
|
max_line_total, total_lines = 0,0
|
||||||
for message in args_to_print:
|
for message in args_to_print:
|
||||||
# fancy code to check if string and convert if not is not need. Just always convert to string :-)
|
# fancy code to check if string and convert if not is not need. Just always convert to string :-)
|
||||||
|
@ -2729,6 +2762,16 @@ def PopupoNonBlocking(*args, button_color=None, auto_close=False, auto_close_dur
|
||||||
PopupNoWait = PopupoNonBlocking
|
PopupNoWait = PopupoNonBlocking
|
||||||
|
|
||||||
|
|
||||||
|
# --------------------------- PopupNoFrame ---------------------------
|
||||||
|
def PopupNoTitlebar(*args, button_color=None, auto_close=False, auto_close_duration=None, font=None):
|
||||||
|
Popup(*args, non_blocking=False, button_color=button_color, auto_close=auto_close, auto_close_duration=auto_close_duration, font=font, no_titlebar=True)
|
||||||
|
return
|
||||||
|
|
||||||
|
PopupNoFrame = PopupNoTitlebar
|
||||||
|
PopupNoBorder = PopupNoTitlebar
|
||||||
|
PopupAnnoying = PopupNoTitlebar
|
||||||
|
|
||||||
|
|
||||||
# ============================== MsgBoxAutoClose====#
|
# ============================== MsgBoxAutoClose====#
|
||||||
# Lazy function. Same as calling MsgBox with parms #
|
# Lazy function. Same as calling MsgBox with parms #
|
||||||
# ===================================================#
|
# ===================================================#
|
||||||
|
|
Loading…
Reference in New Issue