Compare commits

...
Sign in to create a new pull request.

7 commits

Author SHA1 Message Date
PySimpleGUI
41fb096483 4.60.5 Release 2023-06-09 06:13:33 -04:00
PySimpleGUI
e59936e84c 4.60.4 Release 2023-06-09 06:10:36 -04:00
PySimpleGUI
b037e1426b Final 4.60.3 released to PyPI 2022-07-27 17:31:19 -04:00
PySimpleGUI
63f73c222b Trying 4.60.3 AGAIN... this time checking the mac_ver[1] and also checking for releases 13+ 2022-07-27 11:16:48 -04:00
PySimpleGUI
8e9b532657 4.60.3 - Another shot at the Mac OS 12.3+ problem - fixed the version checking 2022-07-27 08:34:19 -04:00
PySimpleGUI
45de5867fb 4.60.2 Candidate Release 2022-07-26 10:44:00 -04:00
PySimpleGUI
ca93e48ad4 4.60.1 patch that was released 22-May-2022 2022-07-26 08:45:57 -04:00

View file

@ -1,10 +1,21 @@
#!/usr/bin/python3 #!/usr/bin/python3
version = __version__ = "4.60.0 Released 8-May-2022" version = __version__ = "4.60.5"
_change_log = """ _change_log = """
Changelog since 4.60.0 released to PyPI on 8-May-2022 Changelog since 4.60.0 released to PyPI on 8-May-2022. These are "Dot" releases....
4.60.1
A "dot-release" / patch for crash that occurs if the horizontal_scroll parm is set in Listbox element
Was created when the ttk scrollbars were added
4.60.2
A "dot-release" for Mac 12.3+ "Invisible window" problem. Adds option in Mac control panel to set Alpha to 0.99 as default
4.60.3
Another shot at the 12.3+ Mac OS problem. Had bug in the version check code
4.60.4
Dot release to quickly fix the Trinket detection which stopped working recently
4.60.5
Fix for the Mac. If running MacOS Ventura 13.2.1 then windows with no titlebar had problems with Input elements. Added support for the Upgrade Service.
""" """
__version__ = version.split()[0] # For PEP 396 and PEP 345 __version__ = version.split()[0] # For PEP 396 and PEP 345
@ -136,7 +147,6 @@ from uuid import uuid4
# get the tkinter detailed version # get the tkinter detailed version
tclversion_detailed = tkinter.Tcl().eval('info patchlevel') tclversion_detailed = tkinter.Tcl().eval('info patchlevel')
framework_version = tclversion_detailed framework_version = tclversion_detailed
import time import time
import pickle import pickle
import calendar import calendar
@ -188,7 +198,7 @@ import re
import tempfile import tempfile
import ctypes import ctypes
import platform import platform
import socket
pil_import_attempted = pil_imported = False pil_import_attempted = pil_imported = False
@ -318,21 +328,22 @@ def running_windows():
return sys.platform.startswith('win') return sys.platform.startswith('win')
def running_trinket(): def running_trinket():
""" """
A special case for Trinket. Checks both the OS and the number of environment variables A special case for Trinket. Uses the hostname an platform together to determine if running on Trinket
Currently, Trinket only has ONE environment variable. This fact is used to figure out if Trinket is being used.
Returns True if "Trinket" (in theory) Returns True if "Trinket" (in theory)
:return: True if sys.platform indicates Linux and the number of environment variables is 1 :return: True if sys.platform indicates Linux and hostname starts with 'pygame-'
:rtype: (bool) :rtype: (bool)
""" """
if len(os.environ) == 1 and sys.platform.startswith('linux'): if sys.platform.startswith('linux') and socket.gethostname().startswith('pygame-'):
return True return True
return False return False
def running_replit(): def running_replit():
""" """
A special case for REPLIT. Checks both the OS and for the existance of the number of environment variable REPL_OWNER A special case for REPLIT. Checks both the OS and for the existance of the number of environment variable REPL_OWNER
@ -419,6 +430,7 @@ DEFAULT_TOOLTIP_TIME = 400
DEFAULT_TOOLTIP_OFFSET = (0, -20) DEFAULT_TOOLTIP_OFFSET = (0, -20)
DEFAULT_KEEP_ON_TOP = None DEFAULT_KEEP_ON_TOP = None
DEFAULT_SCALING = None DEFAULT_SCALING = None
DEFAULT_ALPHA_CHANNEL = 1.0
TOOLTIP_BACKGROUND_COLOR = "#ffffe0" TOOLTIP_BACKGROUND_COLOR = "#ffffe0"
TOOLTIP_FONT = None TOOLTIP_FONT = None
#################### COLOR STUFF #################### #################### COLOR STUFF ####################
@ -612,6 +624,7 @@ ENABLE_TREEVIEW_869_PATCH = True
ENABLE_MAC_NOTITLEBAR_PATCH = False ENABLE_MAC_NOTITLEBAR_PATCH = False
ENABLE_MAC_MODAL_DISABLE_PATCH = False ENABLE_MAC_MODAL_DISABLE_PATCH = False
ENABLE_MAC_DISABLE_GRAB_ANYWHERE_WITH_TITLEBAR = True ENABLE_MAC_DISABLE_GRAB_ANYWHERE_WITH_TITLEBAR = True
ENABLE_MAC_ALPHA_99_PATCH= False
OLD_TABLE_TREE_SELECTED_ROW_COLORS = ('#FFFFFF', '#4A6984') OLD_TABLE_TREE_SELECTED_ROW_COLORS = ('#FFFFFF', '#4A6984')
ALTERNATE_TABLE_AND_TREE_SELECTED_ROW_COLORS = ('SystemHighlightText', 'SystemHighlight') ALTERNATE_TABLE_AND_TREE_SELECTED_ROW_COLORS = ('SystemHighlightText', 'SystemHighlight')
@ -9325,7 +9338,7 @@ class Window:
element_padding=None, margins=(None, None), button_color=None, font=None, element_padding=None, margins=(None, None), button_color=None, font=None,
progress_bar_color=(None, None), background_color=None, border_depth=None, auto_close=False, progress_bar_color=(None, None), background_color=None, border_depth=None, auto_close=False,
auto_close_duration=DEFAULT_AUTOCLOSE_TIME, icon=None, force_toplevel=False, auto_close_duration=DEFAULT_AUTOCLOSE_TIME, icon=None, force_toplevel=False,
alpha_channel=1, return_keyboard_events=False, use_default_focus=True, text_justification=None, alpha_channel=None, return_keyboard_events=False, use_default_focus=True, text_justification=None,
no_titlebar=False, grab_anywhere=False, grab_anywhere_using_control=True, keep_on_top=None, resizable=False, disable_close=False, no_titlebar=False, grab_anywhere=False, grab_anywhere_using_control=True, keep_on_top=None, resizable=False, disable_close=False,
disable_minimize=False, right_click_menu=None, transparent_color=None, debugger_enabled=True, disable_minimize=False, right_click_menu=None, transparent_color=None, debugger_enabled=True,
right_click_menu_background_color=None, right_click_menu_text_color=None, right_click_menu_disabled_text_color=None, right_click_menu_background_color=None, right_click_menu_text_color=None, right_click_menu_disabled_text_color=None,
@ -9515,7 +9528,7 @@ class Window:
self.KeepOnTop = keep_on_top self.KeepOnTop = keep_on_top
self.ForceTopLevel = force_toplevel self.ForceTopLevel = force_toplevel
self.Resizable = resizable self.Resizable = resizable
self._AlphaChannel = alpha_channel self._AlphaChannel = alpha_channel if alpha_channel is not None else DEFAULT_ALPHA_CHANNEL
self.Timeout = None self.Timeout = None
self.TimeoutKey = TIMEOUT_KEY self.TimeoutKey = TIMEOUT_KEY
self.TimerCancelled = False self.TimerCancelled = False
@ -15543,7 +15556,6 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
# Horizontal scrollbar # Horizontal scrollbar
if element.HorizontalScroll: if element.HorizontalScroll:
element.TKText.config(wrap='none')
_make_ttk_scrollbar(element, 'h', toplevel_form) _make_ttk_scrollbar(element, 'h', toplevel_form)
element.hsb.pack(side=tk.BOTTOM, fill='x') element.hsb.pack(side=tk.BOTTOM, fill='x')
element.Widget.configure(xscrollcommand=element.hsb.set) element.Widget.configure(xscrollcommand=element.hsb.set)
@ -16833,7 +16845,10 @@ def StartupTK(window):
# for the Raspberry Pi. Need to set the attributes here, prior to the building of the window # for the Raspberry Pi. Need to set the attributes here, prior to the building of the window
# so going ahead and doing it for all platforms, in addition to doing it after the window is packed # so going ahead and doing it for all platforms, in addition to doing it after the window is packed
_no_titlebar_setup(window) # 2023-April - this call seems to be causing problems on MacOS 13.2.1 Ventura. Input elements become non-responsive
# if this call is made here and at the end of building the window
if not running_mac():
_no_titlebar_setup(window)
if not window.Resizable: if not window.Resizable:
root.resizable(False, False) root.resizable(False, False)
@ -17738,7 +17753,7 @@ def set_options(icon=None, button_color=None, element_size=(None, None), button_
suppress_error_popups=None, suppress_raise_key_errors=None, suppress_key_guessing=None,warn_button_key_duplicates=False, enable_treeview_869_patch=None, suppress_error_popups=None, suppress_raise_key_errors=None, suppress_key_guessing=None,warn_button_key_duplicates=False, enable_treeview_869_patch=None,
enable_mac_notitlebar_patch=None, use_custom_titlebar=None, titlebar_background_color=None, titlebar_text_color=None, titlebar_font=None, enable_mac_notitlebar_patch=None, use_custom_titlebar=None, titlebar_background_color=None, titlebar_text_color=None, titlebar_font=None,
titlebar_icon=None, user_settings_path=None, pysimplegui_settings_path=None, pysimplegui_settings_filename=None, keep_on_top=None, dpi_awareness=None, scaling=None, disable_modal_windows=None, force_modal_windows=None, tooltip_offset=(None, None), titlebar_icon=None, user_settings_path=None, pysimplegui_settings_path=None, pysimplegui_settings_filename=None, keep_on_top=None, dpi_awareness=None, scaling=None, disable_modal_windows=None, force_modal_windows=None, tooltip_offset=(None, None),
sbar_trough_color=None, sbar_background_color=None, sbar_arrow_color=None, sbar_width=None, sbar_arrow_width=None, sbar_frame_color=None, sbar_relief=None): sbar_trough_color=None, sbar_background_color=None, sbar_arrow_color=None, sbar_width=None, sbar_arrow_width=None, sbar_frame_color=None, sbar_relief=None, alpha_channel=None):
""" """
:param icon: Can be either a filename or Base64 value. For Windows if filename, it MUST be ICO format. For Linux, must NOT be ICO. Most portable is to use a Base64 of a PNG file. This works universally across all OS's :param icon: Can be either a filename or Base64 value. For Windows if filename, it MUST be ICO format. For Linux, must NOT be ICO. Most portable is to use a Base64 of a PNG file. This works universally across all OS's
:type icon: bytes | str :type icon: bytes | str
@ -17865,6 +17880,8 @@ def set_options(icon=None, button_color=None, element_size=(None, None), button_
:param sbar_frame_color: Scrollbar Color of frame around scrollbar (available only on some ttk themes) :param sbar_frame_color: Scrollbar Color of frame around scrollbar (available only on some ttk themes)
:type sbar_frame_color: (str) :type sbar_frame_color: (str)
:param sbar_relief: Scrollbar relief that will be used for the "thumb" of the scrollbar (the thing you grab that slides). Should be a constant that is defined at starting with "RELIEF_" - RELIEF_RAISED, RELIEF_SUNKEN, RELIEF_FLAT, RELIEF_RIDGE, RELIEF_GROOVE, RELIEF_SOLID :param sbar_relief: Scrollbar relief that will be used for the "thumb" of the scrollbar (the thing you grab that slides). Should be a constant that is defined at starting with "RELIEF_" - RELIEF_RAISED, RELIEF_SUNKEN, RELIEF_FLAT, RELIEF_RIDGE, RELIEF_GROOVE, RELIEF_SOLID
:param alpha_channel Default alpha channel to be used on all windows
:type alpha_channel (float)
:type sbar_relief: (str) :type sbar_relief: (str)
:return: None :return: None
:rtype: None :rtype: None
@ -17924,6 +17941,8 @@ def set_options(icon=None, button_color=None, element_size=(None, None), button_
global DEFAULT_MODAL_WINDOWS_ENABLED global DEFAULT_MODAL_WINDOWS_ENABLED
global DEFAULT_MODAL_WINDOWS_FORCED global DEFAULT_MODAL_WINDOWS_FORCED
global DEFAULT_TOOLTIP_OFFSET global DEFAULT_TOOLTIP_OFFSET
global DEFAULT_ALPHA_CHANNEL
global _pysimplegui_user_settings global _pysimplegui_user_settings
global ttk_part_overrides_from_options global ttk_part_overrides_from_options
# global _my_windows # global _my_windows
@ -18109,6 +18128,8 @@ def set_options(icon=None, button_color=None, element_size=(None, None), button_
if tooltip_offset != (None, None): if tooltip_offset != (None, None):
DEFAULT_TOOLTIP_OFFSET = tooltip_offset DEFAULT_TOOLTIP_OFFSET = tooltip_offset
if alpha_channel is not None:
DEFAULT_ALPHA_CHANNEL = alpha_channel
# ---------------- ttk scrollbar section ---------------- # ---------------- ttk scrollbar section ----------------
if sbar_background_color is not None: if sbar_background_color is not None:
@ -22254,7 +22275,8 @@ available to make this process more atuomatic.
# Dictionary of Mac Patches. Used to find the key in the global settings and the default value # Dictionary of Mac Patches. Used to find the key in the global settings and the default value
MAC_PATCH_DICT = {'Enable No Titlebar Patch' : ('-mac feature enable no titlebar patch-', False), MAC_PATCH_DICT = {'Enable No Titlebar Patch' : ('-mac feature enable no titlebar patch-', False),
'Disable Modal Windows' : ('-mac feature disable modal windows-', True), 'Disable Modal Windows' : ('-mac feature disable modal windows-', True),
'Disable Grab Anywhere with Titlebar' : ('-mac feature disable grab anywhere with titlebar-', True)} 'Disable Grab Anywhere with Titlebar' : ('-mac feature disable grab anywhere with titlebar-', True),
'Set Alpha Channel to 0.99 for MacOS >= 12.3' : ('-mac feature disable Alpha 0.99', True)}
def _read_mac_global_settings(): def _read_mac_global_settings():
""" """
@ -22265,6 +22287,7 @@ def _read_mac_global_settings():
global ENABLE_MAC_MODAL_DISABLE_PATCH global ENABLE_MAC_MODAL_DISABLE_PATCH
global ENABLE_MAC_NOTITLEBAR_PATCH global ENABLE_MAC_NOTITLEBAR_PATCH
global ENABLE_MAC_DISABLE_GRAB_ANYWHERE_WITH_TITLEBAR global ENABLE_MAC_DISABLE_GRAB_ANYWHERE_WITH_TITLEBAR
global ENABLE_MAC_ALPHA_99_PATCH
ENABLE_MAC_MODAL_DISABLE_PATCH = pysimplegui_user_settings.get(MAC_PATCH_DICT['Disable Modal Windows'][0], ENABLE_MAC_MODAL_DISABLE_PATCH = pysimplegui_user_settings.get(MAC_PATCH_DICT['Disable Modal Windows'][0],
MAC_PATCH_DICT['Disable Modal Windows'][1]) MAC_PATCH_DICT['Disable Modal Windows'][1])
@ -22272,7 +22295,8 @@ def _read_mac_global_settings():
MAC_PATCH_DICT['Enable No Titlebar Patch'][1]) MAC_PATCH_DICT['Enable No Titlebar Patch'][1])
ENABLE_MAC_DISABLE_GRAB_ANYWHERE_WITH_TITLEBAR = pysimplegui_user_settings.get(MAC_PATCH_DICT['Disable Grab Anywhere with Titlebar'][0], ENABLE_MAC_DISABLE_GRAB_ANYWHERE_WITH_TITLEBAR = pysimplegui_user_settings.get(MAC_PATCH_DICT['Disable Grab Anywhere with Titlebar'][0],
MAC_PATCH_DICT['Disable Grab Anywhere with Titlebar'][1]) MAC_PATCH_DICT['Disable Grab Anywhere with Titlebar'][1])
ENABLE_MAC_ALPHA_99_PATCH = pysimplegui_user_settings.get(MAC_PATCH_DICT['Set Alpha Channel to 0.99 for MacOS >= 12.3'][0],
MAC_PATCH_DICT['Set Alpha Channel to 0.99 for MacOS >= 12.3'][1])
def _mac_should_apply_notitlebar_patch(): def _mac_should_apply_notitlebar_patch():
""" """
@ -22295,6 +22319,28 @@ def _mac_should_apply_notitlebar_patch():
return False return False
def _mac_should_set_alpha_to_99():
if not running_mac():
return False
if not ENABLE_MAC_ALPHA_99_PATCH:
return False
# At this point, we're running a Mac and the alpha patch is enabled
# Final check is to see if Mac OS version is 12.3 or later
try:
platform_mac_ver = platform.mac_ver()[0]
mac_ver = platform_mac_ver.split('.') if '.' in platform_mac_ver else (platform_mac_ver, 0)
if (int(mac_ver[0]) >= 12 and int(mac_ver[1]) >= 3) or int(mac_ver[0]) >= 13 :
print("Mac OS Version is {} and patch enabled so applying the patch".format(platform_mac_ver))
return True
except Exception as e:
warnings.warn('_mac_should_seet_alpha_to_99 Exception while trying check mac_ver. Error = {}'.format(e), UserWarning)
return False
return False
def main_mac_feature_control(): def main_mac_feature_control():
""" """
@ -23136,6 +23182,196 @@ RED_X_BASE64 = b'iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAQ5ElEQVR4nO1ca3S
GREEN_CHECK_BASE64 = b'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' GREEN_CHECK_BASE64 = b'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'
'''
M""MMMMM""M dP
M MMMMM M 88
M MMMMM M 88d888b. .d8888b. 88d888b. .d8888b. .d888b88 .d8888b.
M MMMMM M 88' `88 88' `88 88' `88 88' `88 88' `88 88ooood8
M `MMM' M 88. .88 88. .88 88 88. .88 88. .88 88. ...
Mb dM 88Y888P' `8888P88 dP `88888P8 `88888P8 `88888P'
MMMMMMMMMMM 88 .88
dP d8888P
MP""""""`MM oo
M mmmmm..M
M. `YM .d8888b. 88d888b. dP .dP dP .d8888b. .d8888b.
MMMMMMM. M 88ooood8 88' `88 88 d8' 88 88' `"" 88ooood8
M. .MMM' M 88. ... 88 88 .88' 88 88. ... 88. ...
Mb. .dM `88888P' dP 8888P' dP `88888P' `88888P'
MMMMMMMMMMM
'''
__upgrade_server_ip = 'upgradeapi.PySimpleGUI.com'
__upgrade_server_port = '5353'
def __send_dict(ip, port, dict_to_send):
"""
Send a dictionary to the upgrade server and get back a dictionary in response
:param ip: ip address of the upgrade server
:type ip: str
:param port: port number
:type port: int | str
:param dict_to_send: dictionary of items to send
:type dict_to_send: dict
:return: dictionary that is the reply
:rtype: dict
"""
# print(f'sending dictionary to ip {ip} port {port}')
try:
# Create a socket object
s = socket.socket()
s.settimeout(5.0) # set a 5 second timeout
# connect to the server on local computer
s.connect((ip , int(port)))
# send a python dictionary
s.send(json.dumps(dict_to_send).encode())
# receive data from the server
reply_data = s.recv(1024).decode()
# close the connection
s.close()
except Exception as e:
# print(f'Error sending to server:', e)
# print(f'payload:\n', dict_to_send)
reply_data = e
try:
data_dict = json.loads(reply_data)
except Exception as e:
# print(f'UPGRADE THREAD - Error decoding reply {reply_data} as a dictionary. Error = {e}')
data_dict = {}
return data_dict
def __show_previous_upgrade_information():
"""
Shows information about upgrades if upgrade information is waiting to be shown
:return:
"""
# if nothing to show, then just return
if pysimplegui_user_settings.get('-upgrade info seen-', True) and not pysimplegui_user_settings.get('-upgrade info available-', False):
return
if pysimplegui_user_settings.get('-upgrade show only critical-', False) and pysimplegui_user_settings.get('-severity level-', '') != 'Critical':
return
message1 = pysimplegui_user_settings.get('-upgrade message 1-', '')
message2 = pysimplegui_user_settings.get('-upgrade message 2-', '')
recommended_version = pysimplegui_user_settings.get('-upgrade recommendation-', '')
severity_level = pysimplegui_user_settings.get('-severity level-', '')
message2 = r'https://www.PySimpleGUI.org'
layout = [[Image(EMOJI_BASE64_HAPPY_THUMBS_UP), T('An upgrade is available & recommended', font='_ 14')],
[T('It is recommended you upgrade to version {}'.format(recommended_version))],
[T(message1, enable_events=True, k='-MESSAGE 1-')],
[T(message2, enable_events=True, k='-MESSAGE 2-')],
[CB('Do not show this message again in the future', default=True, k='-SKIP IN FUTURE-')],
[B('Close'), T('This window auto-closes in'), T('30', k='-CLOSE TXT-', text_color='white', background_color='red'), T('seconds')]]
window = Window('PySimpleGUI Intelligent Upgrade', layout, finalize=True)
if 'http' in message1:
window['-MESSAGE 1-'].set_cursor('hand1')
if 'http' in message2:
window['-MESSAGE 2-'].set_cursor('hand1')
seconds_left=30
while True:
event, values = window.read(timeout=1000)
if event in ('Close', WIN_CLOSED) or seconds_left < 1:
break
if values['-SKIP IN FUTURE-']:
pysimplegui_user_settings['-upgrade info available-'] = False
pysimplegui_user_settings['-upgrade info seen-'] = True
if event == '-MESSAGE 1-' and 'http' in message1 and webbrowser_available:
webbrowser.open_new_tab(message1)
elif event == '-MESSAGE 2-' and 'http' in message2 and webbrowser_available:
webbrowser.open_new_tab(message2)
window['-CLOSE TXT-'].update(seconds_left)
seconds_left -= 1
window.close()
def __get_linux_distribution():
with open('/etc/os-release') as f:
data = f.read()
lines = data.split('\n')
for line in lines:
if line.startswith('PRETTY_NAME'):
line_split = line.split('=')[1].strip('"')
line_tuple = tuple(line_split.split(' '))
return line_tuple
return ('Linux Distro', 'Unknown','No lines Found in //etc//os-release')
def __perform_upgrade_check_thread():
# print(f'Upgrade thread...seen = {pysimplegui_user_settings.get("-upgrade info seen-", False)}')
try:
if running_trinket():
os_name = 'Trinket'
os_ver = __get_linux_distribution()
elif running_replit():
os_name = 'REPL.IT'
os_ver = __get_linux_distribution()
elif running_windows():
os_name = 'Windows'
os_ver = platform.win32_ver()
elif running_linux():
os_name = 'Linux'
os_ver = __get_linux_distribution()
elif running_mac():
os_name = 'Mac'
os_ver = platform.mac_ver()
else:
os_name = 'Other'
os_ver = ''
psg_ver = version
framework_ver = framework_version
python_ver = sys.version
upgrade_dict = {
'OSName' : str(os_name),
'OSVersion' : str(os_ver),
'PythonVersion' : str(python_ver),
'PSGVersion' : str(psg_ver),
'FrameworkName' : 'tkinter',
'FrameworkVersion' : str(framework_ver),
}
reply_data = __send_dict(__upgrade_server_ip, __upgrade_server_port, upgrade_dict)
recommended_version = reply_data.get('SuggestedVersion', '')
message1 = reply_data.get('Message1', '')
message2 = reply_data.get('Message2', '')
severity_level = reply_data.get('SeverityLevel', '')
# If any part of the reply has changed from the last reply, overwrite the data and set flags so user will be informed
if (message1 or message2) and not running_trinket():
if pysimplegui_user_settings.get('-upgrade message 1-', '') != message1 or \
pysimplegui_user_settings.get('-upgrade message 2-', '') != message2 or \
pysimplegui_user_settings.get('-upgrade recommendation-', '') != recommended_version or \
pysimplegui_user_settings.get('-severity level-', '') != severity_level:
# Save the data to the settings file
pysimplegui_user_settings['-upgrade info seen-'] = False
pysimplegui_user_settings['-upgrade info available-'] = True
pysimplegui_user_settings['-upgrade message 1-'] = message1
pysimplegui_user_settings['-upgrade message 2-'] = message2
pysimplegui_user_settings['-upgrade recommendation-'] = recommended_version
pysimplegui_user_settings['-severity level-'] = severity_level
except Exception as e:
reply_data = {}
# print('Upgrade server error', e)
# print(f'Upgrade Reply = {reply_data}')
def __perform_upgrade_check():
# For now, do not show data returned. Still testing and do not want to "SPAM" users with any popups
# __show_previous_upgrade_information()
threading.Thread(target=lambda: __perform_upgrade_check_thread(), daemon=True).start()
# =========================================================================# # =========================================================================#
# MP""""""`MM dP dP # MP""""""`MM dP dP
# M mmmmm..M 88 88 # M mmmmm..M 88 88
@ -23229,7 +23465,7 @@ GREEN_CHECK_BASE64 = b'iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAJV0lEQVR4n
def _github_issue_post_make_markdown(issue_type, operating_system, os_ver, psg_port, psg_ver, gui_ver, python_ver, def _github_issue_post_make_markdown(issue_type, operating_system, os_ver, psg_port, psg_ver, gui_ver, python_ver,
python_exp, prog_exp, used_gui, gui_notes, python_exp, prog_exp, used_gui, gui_notes,
cb_docs, cb_demos, cb_demo_port, cb_readme_other, cb_command_line, cb_issues, cb_github, cb_docs, cb_demos, cb_demo_port, cb_readme_other, cb_command_line, cb_issues, cb_latest_pypi, cb_github,
detailed_desc, code, project_details, where_found): detailed_desc, code, project_details, where_found):
body = \ body = \
""" """
@ -23287,11 +23523,12 @@ def _github_issue_post_make_markdown(issue_type, operating_system, os_ver, psg_p
These items may solve your problem. Please check those you've done by changing - [ ] to - [X] These items may solve your problem. Please check those you've done by changing - [ ] to - [X]
- [{}] Searched main docs for your problem www.PySimpleGUI.org - [{}] Searched main docs for your problem www.PySimpleGUI.org
- [{}] Looked for Demo Programs that are similar to your goal Demos.PySimpleGUI.org - [{}] Looked for Demo Programs that are similar to your goal. It is recommend you use the Demo Browser! Demos.PySimpleGUI.org
- [{}] If not tkinter - looked for Demo Programs for specific port - [{}] If not tkinter - looked for Demo Programs for specific port
- [{}] For non tkinter - Looked at readme for your specific port if not PySimpleGUI (Qt, WX, Remi) - [{}] For non tkinter - Looked at readme for your specific port if not PySimpleGUI (Qt, WX, Remi)
- [{}] Run your program outside of your debugger (from a command line) - [{}] Run your program outside of your debugger (from a command line)
- [{}] Searched through Issues (open and closed) to see if already reported Issues.PySimpleGUI.org - [{}] Searched through Issues (open and closed) to see if already reported Issues.PySimpleGUI.org
- [{}] Upgraded to the latest official release of PySimpleGUI on PyPI
- [{}] Tried using the PySimpleGUI.py file on GitHub. Your problem may have already been fixed but not released - [{}] Tried using the PySimpleGUI.py file on GitHub. Your problem may have already been fixed but not released
## Detailed Description ## Detailed Description
@ -23312,7 +23549,7 @@ These items may solve your problem. Please check those you've done by changing -
""".format(python_exp, prog_exp, used_gui, gui_notes, """.format(python_exp, prog_exp, used_gui, gui_notes,
cb_docs, cb_demos, cb_demo_port, cb_readme_other, cb_command_line, cb_issues, cb_github, cb_docs, cb_demos, cb_demo_port, cb_readme_other, cb_command_line, cb_issues, cb_latest_pypi, cb_github,
detailed_desc, code if len(code) > 10 else '# Paste your code here') detailed_desc, code if len(code) > 10 else '# Paste your code here')
@ -23496,11 +23733,12 @@ def main_open_github_issue():
[In(size=(25, 1), k='-EXP NOTES-', expand_x=True)]] [In(size=(25, 1), k='-EXP NOTES-', expand_x=True)]]
checklist = (('Searched main docs for your problem', 'www.PySimpleGUI.org'), checklist = (('Searched main docs for your problem', 'www.PySimpleGUI.org'),
('Looked for Demo Programs that are similar to your goal ', 'http://Demos.PySimpleGUI.org'), ('Looked for Demo Programs that are similar to your goal.\nIt is recommend you use the Demo Browser!', 'https://Demos.PySimpleGUI.org'),
('If not tkinter - looked for Demo Programs for specific port', ''), ('If not tkinter - looked for Demo Programs for specific port', ''),
('For non tkinter - Looked at readme for your specific port if not PySimpleGUI (Qt, WX, Remi)', ''), ('For non tkinter - Looked at readme for your specific port if not PySimpleGUI (Qt, WX, Remi)', ''),
('Run your program outside of your debugger (from a command line)', ''), ('Run your program outside of your debugger (from a command line)', ''),
('Searched through Issues (open and closed) to see if already reported', 'http://Issues.PySimpleGUI.org'), ('Searched through Issues (open and closed) to see if already reported', 'https://Issues.PySimpleGUI.org'),
('Upgraded to the latest official release of PySimpleGUI on PyPI', 'https://Upgrading.PySimpleGUI.org'),
('Tried using the PySimpleGUI.py file on GitHub. Your problem may have already been fixed but not released.', '')) ('Tried using the PySimpleGUI.py file on GitHub. Your problem may have already been fixed but not released.', ''))
checklist_col1 = Col([[CB(c, k=('-CB-', i)), T(t, k='-T{}-'.format(i), enable_events=True)] for i, (c, t) in enumerate(checklist[:4])], k='-C FRAME CBs1-') checklist_col1 = Col([[CB(c, k=('-CB-', i)), T(t, k='-T{}-'.format(i), enable_events=True)] for i, (c, t) in enumerate(checklist[:4])], k='-C FRAME CBs1-')
@ -23563,6 +23801,15 @@ def main_open_github_issue():
# window['-ML DETAILS-'].expand(True, True, True) # window['-ML DETAILS-'].expand(True, True, True)
# window['-ML MARKDOWN-'].expand(True, True, True) # window['-ML MARKDOWN-'].expand(True, True, True)
# window['-PANE-'].expand(True, True, True) # window['-PANE-'].expand(True, True, True)
if running_mac():
window['-OS MAC VER-'].update(platform.mac_ver())
elif running_windows():
window['-OS WIN VER-'].update(platform.win32_ver())
elif running_linux():
window['-OS LINUX VER-'].update(platform.libc_ver())
window.bring_to_front() window.bring_to_front()
while True: # Event Loop while True: # Event Loop
event, values = window.read() event, values = window.read()
@ -23624,7 +23871,7 @@ def main_open_github_issue():
continue continue
cb_dict = {'cb_docs': checkboxes[0], 'cb_demos': checkboxes[1], 'cb_demo_port': checkboxes[2], 'cb_readme_other': checkboxes[3], cb_dict = {'cb_docs': checkboxes[0], 'cb_demos': checkboxes[1], 'cb_demo_port': checkboxes[2], 'cb_readme_other': checkboxes[3],
'cb_command_line': checkboxes[4], 'cb_issues': checkboxes[5], 'cb_github': checkboxes[6], 'detailed_desc': values['-ML DETAILS-'], 'cb_command_line': checkboxes[4], 'cb_issues': checkboxes[5], 'cb_latest_pypi': checkboxes[6], 'cb_github': checkboxes[7], 'detailed_desc': values['-ML DETAILS-'],
'code': values['-ML CODE-'], 'code': values['-ML CODE-'],
'project_details': values['-ML PROJECT DETAILS-'].rstrip(), 'project_details': values['-ML PROJECT DETAILS-'].rstrip(),
'where_found': values['-ML FOUND PSG-']} 'where_found': values['-ML FOUND PSG-']}
@ -24199,37 +24446,37 @@ def main_sdk_help():
""" """
online_help_links = { online_help_links = {
'Button': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#button-element', 'Button': r'https://PySimpleGUI.org/en/latest/call%20reference/#button-element',
'ButtonMenu': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#buttonmenu-element', 'ButtonMenu': r'https://PySimpleGUI.org/en/latest/call%20reference/#buttonmenu-element',
'Canvas': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#canvas-element', 'Canvas': r'https://PySimpleGUI.org/en/latest/call%20reference/#canvas-element',
'Checkbox': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#checkbox-element', 'Checkbox': r'https://PySimpleGUI.org/en/latest/call%20reference/#checkbox-element',
'Column': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#column-element', 'Column': r'https://PySimpleGUI.org/en/latest/call%20reference/#column-element',
'Combo': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#combo-element', 'Combo': r'https://PySimpleGUI.org/en/latest/call%20reference/#combo-element',
'Frame': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#frame-element', 'Frame': r'https://PySimpleGUI.org/en/latest/call%20reference/#frame-element',
'Graph': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#graph-element', 'Graph': r'https://PySimpleGUI.org/en/latest/call%20reference/#graph-element',
'HorizontalSeparator': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#horizontalseparator-element', 'HorizontalSeparator': r'https://PySimpleGUI.org/en/latest/call%20reference/#horizontalseparator-element',
'Image': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#image-element', 'Image': r'https://PySimpleGUI.org/en/latest/call%20reference/#image-element',
'Input': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#input-element', 'Input': r'https://PySimpleGUI.org/en/latest/call%20reference/#input-element',
'Listbox': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#listbox-element', 'Listbox': r'https://PySimpleGUI.org/en/latest/call%20reference/#listbox-element',
'Menu': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#menu-element', 'Menu': r'https://PySimpleGUI.org/en/latest/call%20reference/#menu-element',
'MenubarCustom': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#menubarcustom-element', 'MenubarCustom': r'https://PySimpleGUI.org/en/latest/call%20reference/#menubarcustom-element',
'Multiline': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#multiline-element', 'Multiline': r'https://PySimpleGUI.org/en/latest/call%20reference/#multiline-element',
'OptionMenu': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#optionmenu-element', 'OptionMenu': r'https://PySimpleGUI.org/en/latest/call%20reference/#optionmenu-element',
'Output': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#output-element', 'Output': r'https://PySimpleGUI.org/en/latest/call%20reference/#output-element',
'Pane': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#pane-element', 'Pane': r'https://PySimpleGUI.org/en/latest/call%20reference/#pane-element',
'ProgressBar': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#progressbar-element', 'ProgressBar': r'https://PySimpleGUI.org/en/latest/call%20reference/#progressbar-element',
'Radio': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#radio-element', 'Radio': r'https://PySimpleGUI.org/en/latest/call%20reference/#radio-element',
'Slider': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#slider-element', 'Slider': r'https://PySimpleGUI.org/en/latest/call%20reference/#slider-element',
'Spin': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#spin-element', 'Spin': r'https://PySimpleGUI.org/en/latest/call%20reference/#spin-element',
'StatusBar': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#statusbar-element', 'StatusBar': r'https://PySimpleGUI.org/en/latest/call%20reference/#statusbar-element',
'Tab': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#tab-element', 'Tab': r'https://PySimpleGUI.org/en/latest/call%20reference/#tab-element',
'TabGroup': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#tabgroup-element', 'TabGroup': r'https://PySimpleGUI.org/en/latest/call%20reference/#tabgroup-element',
'Table': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#table-element', 'Table': r'https://PySimpleGUI.org/en/latest/call%20reference/#table-element',
'Text': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#text-element', 'Text': r'https://PySimpleGUI.org/en/latest/call%20reference/#text-element',
'Titlebar': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#titlebar-element', 'Titlebar': r'https://PySimpleGUI.org/en/latest/call%20reference/#titlebar-element',
'Tree': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#tree-element', 'Tree': r'https://PySimpleGUI.org/en/latest/call%20reference/#tree-element',
'VerticalSeparator': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#verticalseparator-element', 'VerticalSeparator': r'https://PySimpleGUI.org/en/latest/call%20reference/#verticalseparator-element',
'Window': r'https://pysimplegui.readthedocs.io/en/latest/call%20reference/#window', 'Window': r'https://PySimpleGUI.org/en/latest/call%20reference/#window',
} }
NOT_AN_ELEMENT = 'Not An Element' NOT_AN_ELEMENT = 'Not An Element'
@ -24516,14 +24763,23 @@ def _create_main_window():
frame6 = [[VPush()],[graph_elem]] frame6 = [[VPush()],[graph_elem]]
global_settings_tab_layout = [[T('Settings Filename:'), T(pysimplegui_user_settings.full_filename, s=(50,2))],
[T('Settings Dictionary:'), MLine(pysimplegui_user_settings, size=(50,8))],
]
themes_tab_layout = [[T('You can see a preview of the themes, the color swatches, or switch themes for this window')], themes_tab_layout = [[T('You can see a preview of the themes, the color swatches, or switch themes for this window')],
[T('If you want to change the default theme for PySimpleGUI, use the Global Settings')], [T('If you want to change the default theme for PySimpleGUI, use the Global Settings')],
[B('Themes'), B('Theme Swatches'), B('Switch Themes')]] [B('Themes'), B('Theme Swatches'), B('Switch Themes')]]
upgrade_recommendation_tab_layout = [[T('Latest Recommendation and Announcements For You', font='_ 14')],
[T('Severity Level of Update:'), T(pysimplegui_user_settings.get('-severity level-',''))],
[T('Recommended Version To Upgrade To:'), T(pysimplegui_user_settings.get('-upgrade recommendation-',''))],
[T(pysimplegui_user_settings.get('-upgrade message 1-',''))],
[T(pysimplegui_user_settings.get('-upgrade message 2-',''))],
[Checkbox('Show Only Critical Messages', default=pysimplegui_user_settings.get('-upgrade show only critical-', False), key='-UPGRADE SHOW ONLY CRITICAL-', enable_events=True)],
[Button('Show Notification Again'), B('Upgrade from GitHub', button_color='white on red', key='-UPGRADE FROM GITHUB-'),
],
]
tab_upgrade = Tab('Upgrade\n',upgrade_recommendation_tab_layout, expand_x=True)
tab1 = Tab('Graph\n', frame6, tooltip='Graph is in here', title_color='red') tab1 = Tab('Graph\n', frame6, tooltip='Graph is in here', title_color='red')
tab2 = Tab('CB, Radio\nList, Combo', tab2 = Tab('CB, Radio\nList, Combo',
[[Frame('Multiple Choice Group', frame2, title_color='#FFFFFF', tooltip='Checkboxes, radio buttons, etc', vertical_alignment='t',), [[Frame('Multiple Choice Group', frame2, title_color='#FFFFFF', tooltip='Checkboxes, radio buttons, etc', vertical_alignment='t',),
@ -24535,25 +24791,25 @@ def _create_main_window():
tab6 = Tab('Course or\nSponsor', frame7, k='-TAB SPONSOR-') tab6 = Tab('Course or\nSponsor', frame7, k='-TAB SPONSOR-')
tab7 = Tab('Popups\n', pop_test_tab_layout, k='-TAB POPUP-') tab7 = Tab('Popups\n', pop_test_tab_layout, k='-TAB POPUP-')
tab8 = Tab('Themes\n', themes_tab_layout, k='-TAB THEMES-') tab8 = Tab('Themes\n', themes_tab_layout, k='-TAB THEMES-')
tab9 = Tab('Global\nSettings', global_settings_tab_layout, k='-TAB GlOBAL SETTINGS-')
def VerLine(version, description, justification='r', size=(40, 1)): def VerLine(version, description, justification='r', size=(40, 1)):
return [T(version, justification=justification, font='Any 12', text_color='yellow', size=size, pad=(0,0)), vtop(T(description, font='Any 12', pad=(0,0)))] return [T(version, justification=justification, font='Any 12', text_color='yellow', size=size, pad=(0,0)), T(description, font='Any 12', pad=(0,0))]
layout_top = Column([ layout_top = Column([
[Image(EMOJI_BASE64_HAPPY_BIG_SMILE, enable_events=True, key='-LOGO-', tooltip='This is PySimpleGUI logo'), [Image(EMOJI_BASE64_HAPPY_BIG_SMILE, enable_events=True, key='-LOGO-', tooltip='This is PySimpleGUI logo'),
Image(data=DEFAULT_BASE64_LOADING_GIF, enable_events=True, key='-IMAGE-'), Image(data=DEFAULT_BASE64_LOADING_GIF, enable_events=True, key='-IMAGE-'),
Text('PySimpleGUI Test Harness\nYou are running PySimpleGUI.py file vs importing', font='ANY 14', Text('PySimpleGUI Test Harness', font='ANY 14',
tooltip='My tooltip', key='-TEXT1-')], tooltip='My tooltip', key='-TEXT1-')],
VerLine(ver, 'PySimpleGUI Version') + [Image(HEART_3D_BASE64, subsample=4)], VerLine(ver, 'PySimpleGUI Version') + [Image(HEART_3D_BASE64, subsample=4)],
VerLine('{}/{}'.format(tkversion, tclversion), 'TK/TCL Versions'), # VerLine('{}/{}'.format(tkversion, tclversion), 'TK/TCL Versions'),
VerLine(tclversion_detailed, 'detailed tkinter version'), VerLine(tclversion_detailed, 'detailed tkinter version'),
VerLine(os.path.dirname(os.path.abspath(__file__)), 'PySimpleGUI Location', size=(40, 2)), VerLine(os.path.dirname(os.path.abspath(__file__)), 'PySimpleGUI Location', size=(40, None)),
VerLine(sys.executable, 'Python Executable'),
VerLine(sys.version, 'Python Version', size=(40,2)) +[Image(PYTHON_COLORED_HEARTS_BASE64, subsample=3, k='-PYTHON HEARTS-', enable_events=True)]], pad=0) VerLine(sys.version, 'Python Version', size=(40,2)) +[Image(PYTHON_COLORED_HEARTS_BASE64, subsample=3, k='-PYTHON HEARTS-', enable_events=True)]], pad=0)
layout_bottom = [ layout_bottom = [
[B(SYMBOL_DOWN, pad=(0, 0), k='-HIDE TABS-'), [B(SYMBOL_DOWN, pad=(0, 0), k='-HIDE TABS-'),
pin(Col([[TabGroup([[tab1, tab2, tab3, tab6, tab4, tab5, tab7, tab8, tab9]], key='-TAB_GROUP-')]], k='-TAB GROUP COL-'))], pin(Col([[TabGroup([[tab1, tab2, tab3, tab6, tab4, tab5, tab7, tab8, tab_upgrade]], key='-TAB_GROUP-')]], k='-TAB GROUP COL-'))],
[B('Button', highlight_colors=('yellow', 'red'),pad=(1, 0)), [B('Button', highlight_colors=('yellow', 'red'),pad=(1, 0)),
B('ttk Button', use_ttk_buttons=True, tooltip='This is a TTK Button',pad=(1, 0)), B('ttk Button', use_ttk_buttons=True, tooltip='This is a TTK Button',pad=(1, 0)),
B('See-through Mode', tooltip='Make the background transparent',pad=(1, 0)), B('See-through Mode', tooltip='Make the background transparent',pad=(1, 0)),
@ -24656,7 +24912,7 @@ def main():
elif event.startswith('See'): elif event.startswith('See'):
window._see_through = not window._see_through window._see_through = not window._see_through
window.set_transparent_color(theme_background_color() if window._see_through else '') window.set_transparent_color(theme_background_color() if window._see_through else '')
elif event == '-INSTALL-': elif event == '-INSTALL-' or event == '-UPGRADE FROM GITHUB-':
_upgrade_gui() _upgrade_gui()
elif event == 'Popup': elif event == 'Popup':
popup('This is your basic popup', keep_on_top=True) popup('This is your basic popup', keep_on_top=True)
@ -24726,6 +24982,13 @@ def main():
window.minimize() window.minimize()
main_open_github_issue() main_open_github_issue()
window.normal() window.normal()
elif event == 'Show Notification Again':
pysimplegui_user_settings.set('-upgrade info seen-', False)
__show_previous_upgrade_information()
elif event == '-UPGRADE SHOW ONLY CRITICAL-':
pysimplegui_user_settings.set('-upgrade show only critical-', values['-UPGRADE SHOW ONLY CRITICAL-'])
i += 1 i += 1
# _refresh_debugger() # _refresh_debugger()
print('event = ', event) print('event = ', event)
@ -24813,6 +25076,10 @@ if running_windows():
_read_mac_global_settings() _read_mac_global_settings()
if _mac_should_set_alpha_to_99():
# Applyting Mac OS 12.3+ Alpha Channel fix. Sets the default Alpha Channel to 0.99
set_options(alpha_channel=0.99)
# if running_mac(): # if running_mac():
# print('Your Mac patches are:') # print('Your Mac patches are:')
# print('Modal windows disabled:', ENABLE_MAC_MODAL_DISABLE_PATCH) # print('Modal windows disabled:', ENABLE_MAC_MODAL_DISABLE_PATCH)
@ -24820,6 +25087,10 @@ _read_mac_global_settings()
# print('No grab anywhere allowed with titlebar:', ENABLE_MAC_DISABLE_GRAB_ANYWHERE_WITH_TITLEBAR) # print('No grab anywhere allowed with titlebar:', ENABLE_MAC_DISABLE_GRAB_ANYWHERE_WITH_TITLEBAR)
# print('Currently the no titlebar patch ' + ('WILL' if _mac_should_apply_notitlebar_patch() else 'WILL NOT') + ' be applied') # print('Currently the no titlebar patch ' + ('WILL' if _mac_should_apply_notitlebar_patch() else 'WILL NOT') + ' be applied')
__perform_upgrade_check()
# -------------------------------- ENTRY POINT IF RUN STANDALONE -------------------------------- # # -------------------------------- ENTRY POINT IF RUN STANDALONE -------------------------------- #
if __name__ == '__main__': if __name__ == '__main__':
# To execute the upgrade from command line, type: # To execute the upgrade from command line, type: