Merge pull request #6164 from PySimpleGUI/Dev-latest

Moved debugger constants to sinde of the debugger class. Simplified t…
This commit is contained in:
PySimpleGUI 2023-01-12 21:06:44 -05:00 committed by GitHub
commit 6b20da8c59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 55 additions and 49 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3
version = __version__ = "4.60.4.138 Unreleased"
version = __version__ = "4.60.4.139 Unreleased"
_change_log = """
Changelog since 4.60.0 released to PyPI on 8-May-2022
@ -343,6 +343,8 @@ _change_log = """
"Take me to error" button is disabled in error traceback popup if not editor is configured. Also adds instructions if no editor.
4.60.4.138
Added begin_at_sunday_plus to the CalendarButton docstring
4.60.4.139
Moved debugger constants to sinde of the debugger class. Simplified the locals and globals popups.
"""
@ -23654,26 +23656,28 @@ def main_mac_feature_control():
red_x = b"R0lGODlhEAAQAPeQAIsAAI0AAI4AAI8AAJIAAJUAAJQCApkAAJoAAJ4AAJkJCaAAAKYAAKcAAKcCAKcDA6cGAKgAAKsAAKsCAKwAAK0AAK8AAK4CAK8DAqUJAKULAKwLALAAALEAALIAALMAALMDALQAALUAALYAALcEALoAALsAALsCALwAAL8AALkJAL4NAL8NAKoTAKwbAbEQALMVAL0QAL0RAKsREaodHbkQELMsALg2ALk3ALs+ALE2FbgpKbA1Nbc1Nb44N8AAAMIWAMsvAMUgDMcxAKVABb9NBbVJErFYEq1iMrtoMr5kP8BKAMFLAMxKANBBANFCANJFANFEB9JKAMFcANFZANZcANpfAMJUEMZVEc5hAM5pAMluBdRsANR8AM9YOrdERMpIQs1UVMR5WNt8X8VgYMdlZcxtYtx4YNF/btp9eraNf9qXXNCCZsyLeNSLd8SSecySf82kd9qqc9uBgdyBgd+EhN6JgtSIiNuJieGHhOGLg+GKhOKamty1ste4sNO+ueenp+inp+HHrebGrefKuOPTzejWzera1O7b1vLb2/bl4vTu7fbw7ffx7vnz8f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAJAALAAAAAAQABAAAAjUACEJHEiwYEEABniQKfNFgQCDkATQwAMokEU+PQgUFDAjjR09e/LUmUNnh8aBCcCgUeRmzBkzie6EeQBAoAAMXuA8ciRGCaJHfXzUMCAQgYooWN48anTokR8dQk4sELggBhQrU9Q8evSHiJQgLCIIfMDCSZUjhbYuQkLFCRAMAiOQGGLE0CNBcZYmaRIDLqQFGF60eTRoSxc5jwjhACFWIAgMLtgUocJFy5orL0IQRHAiQgsbRZYswbEhBIiCCH6EiJAhAwQMKU5DjHCi9gnZEHMTDAgAOw=="
COLOR_SCHEME = 'dark grey 13'
DEBUGGER_POPOUT_THEME = 'dark grey 13'
WIDTH_VARIABLES = 23
WIDTH_RESULTS = 46
WIDTH_WATCHER_VARIABLES = 20
WIDTH_WATCHER_RESULTS = 60
WIDTH_LOCALS = 80
NUM_AUTO_WATCH = 9
MAX_LINES_PER_RESULT_FLOATING = 4
MAX_LINES_PER_RESULT_MAIN = 3
POPOUT_WINDOW_FONT = 'Sans 8'
DEBUGGER_VARIABLE_DETAILS_FONT = 'Courier 10'
class _Debugger:
debugger = None
DEBUGGER_MAIN_WINDOW_THEME = 'dark grey 13'
DEBUGGER_POPOUT_THEME = 'dark grey 13'
WIDTH_VARIABLES = 23
WIDTH_RESULTS = 46
WIDTH_WATCHER_VARIABLES = 20
WIDTH_WATCHER_RESULTS = 60
WIDTH_LOCALS = 80
NUM_AUTO_WATCH = 9
MAX_LINES_PER_RESULT_FLOATING = 4
MAX_LINES_PER_RESULT_MAIN = 3
DEBUGGER_POPOUT_WINDOW_FONT = 'Sans 8'
DEBUGGER_VARIABLE_DETAILS_FONT = 'Courier 10'
'''
# # ######
## ## ## # # # # # ###### ##### # # #### #### ###### #####
@ -23696,12 +23700,12 @@ class _Debugger:
# Includes the DUAL PANE (now 2 tabs)! Don't forget REPL is there too!
def _build_main_debugger_window(self, location=(None, None)):
old_theme = theme()
theme(COLOR_SCHEME)
theme(_Debugger.DEBUGGER_MAIN_WINDOW_THEME)
def InVar(key1):
row1 = [T(' '),
I(key=key1, size=(WIDTH_VARIABLES, 1)),
T('', key=key1 + 'CHANGED_', size=(WIDTH_RESULTS, 1)), B('Detail', key=key1 + 'DETAIL_'),
I(key=key1, size=(_Debugger.WIDTH_VARIABLES, 1)),
T('', key=key1 + 'CHANGED_', size=(_Debugger.WIDTH_RESULTS, 1)), B('Detail', key=key1 + 'DETAIL_'),
B('Obj', key=key1 + 'OBJ_'), ]
return row1
@ -23722,10 +23726,9 @@ class _Debugger:
Button('Popout', key='-POPOUT-')]]
var_layout = []
for i in range(NUM_AUTO_WATCH):
var_layout.append([T('', size=(WIDTH_WATCHER_VARIABLES, 1), key='_WATCH%s_' % i),
T('', size=(WIDTH_WATCHER_RESULTS, MAX_LINES_PER_RESULT_MAIN), key='_WATCH%s_RESULT_' % i,
)])
for i in range(_Debugger.NUM_AUTO_WATCH):
var_layout.append([T('', size=(_Debugger.WIDTH_WATCHER_VARIABLES, 1), key='_WATCH%s_' % i),
T('', size=(_Debugger.WIDTH_WATCHER_RESULTS, _Debugger.MAX_LINES_PER_RESULT_MAIN), key='_WATCH%s_RESULT_' % i,)])
col1 = [
# [Frame('Auto Watches', autowatch_frame+variable_values, title_color='blue')]
@ -23742,8 +23745,7 @@ class _Debugger:
[TabGroup([[Tab('Variables', col1), Tab('REPL & Watches', col2)]])]]
# ------------------------------- Create main window -------------------------------
window = Window("PySimpleGUI Debugger", layout, icon=PSG_DEBUGGER_LOGO, margins=(0, 0), location=location, keep_on_top=True,
right_click_menu=[[''], ['Exit', ]])
window = Window("PySimpleGUI Debugger", layout, icon=PSG_DEBUGGER_LOGO, margins=(0, 0), location=location, keep_on_top=True, right_click_menu=[[''], ['Exit', ]])
Window._read_call_from_debugger = True
window.finalize()
@ -23801,7 +23803,7 @@ class _Debugger:
result = str(eval(str(var), myglobals, mylocals))
except:
result = ''
popup_scrolled(str(values['_VAR{}_'.format(event[4])]) + '\n' + result, title=var, non_blocking=True, font=DEBUGGER_VARIABLE_DETAILS_FONT)
popup_scrolled(str(values['_VAR{}_'.format(event[4])]) + '\n' + result, title=var, non_blocking=True, font=_Debugger.DEBUGGER_VARIABLE_DETAILS_FONT)
# BUTTON - OBJ
elif event.endswith('_OBJ_'): # OBJECT BUTTON
var = values['_VAR{}_'.format(event[4])]
@ -23813,17 +23815,17 @@ class _Debugger:
result = ObjToStringSingleObj(result)
except Exception as e:
result = '{}\nError showing object {}'.format(e, var)
popup_scrolled(str(var) + '\n' + str(result), title=var, non_blocking=True, font=DEBUGGER_VARIABLE_DETAILS_FONT)
popup_scrolled(str(var) + '\n' + str(result), title=var, non_blocking=True, font=Debugger.DEBUGGER_VARIABLE_DETAILS_FONT)
# ------------------------------- Process Watch Tab -------------------------------
# BUTTON - Choose Locals to see
elif event == '-LOCALS-': # Show all locals BUTTON
self._choose_auto_watches(mylocals)
# BUTTON - Locals (quick popup)
elif event == '-ALL_LOCALS-':
self._display_all_vars(mylocals)
self._display_all_vars('All Locals', mylocals)
# BUTTON - Globals (quick popup)
elif event == '-GLOBALS-':
self._display_all_vars(myglobals)
self._display_all_vars('All Globals', myglobals)
# BUTTON - clear all
elif event == 'Clear All Auto Watches':
if popup_yes_no('Do you really want to clear all Auto-Watches?', 'Really Clear??') == 'Yes':
@ -23866,7 +23868,7 @@ class _Debugger:
self.watcher_window.Element('_WATCH{}_RESULT_'.format(slot)).Update('')
slot += 1
if slot + int(not self.custom_watch in (None, '')) >= NUM_AUTO_WATCH:
if slot + int(not self.custom_watch in (None, '')) >= _Debugger.NUM_AUTO_WATCH:
break
# If a custom watch was set, display that value in the window
if self.custom_watch:
@ -23878,7 +23880,7 @@ class _Debugger:
self.watcher_window.Element('_WATCH{}_RESULT_'.format(slot)).Update(self.myrc)
slot += 1
# blank out all of the slots not used (blank)
for i in range(slot, NUM_AUTO_WATCH):
for i in range(slot, _Debugger.NUM_AUTO_WATCH):
self.watcher_window.Element('_WATCH{}_'.format(i)).Update('')
self.watcher_window.Element('_WATCH{}_RESULT_'.format(i)).Update('')
@ -23927,12 +23929,12 @@ class _Debugger:
'''
# displays them into a single text box
def _display_all_vars(self, dict):
def _display_all_vars(self, title, dict):
num_cols = 3
output_text = ''
num_lines = 2
cur_col = 0
out_text = 'All of your Vars'
out_text = title + '\n'
longest_line = max([len(key) for key in dict])
line = []
sorted_dict = {}
@ -23940,15 +23942,19 @@ class _Debugger:
sorted_dict[key] = dict[key]
for key in sorted_dict:
value = dict[key]
wrapped_list = textwrap.wrap(str(value), 60)
wrapped_text = '\n'.join(wrapped_list)
# wrapped_list = textwrap.wrap(str(value), 60)
# wrapped_text = '\n'.join(wrapped_list)
wrapped_text = str(value)
out_text += '{} - {}\n'.format(key, wrapped_text)
if cur_col + 1 == num_cols:
cur_col = 0
num_lines += len(wrapped_list)
else:
cur_col += 1
popup_scrolled(out_text, non_blocking=True)
# if cur_col + 1 == num_cols:
# cur_col = 0
# num_lines += len(wrapped_list)
# else:
# cur_col += 1
old_theme = theme()
theme(_Debugger.DEBUGGER_MAIN_WINDOW_THEME)
popup_scrolled(out_text, title=title, non_blocking=True, font=_Debugger.DEBUGGER_VARIABLE_DETAILS_FONT, keep_on_top=True, icon=PSG_DEBUGGER_LOGO)
theme(old_theme)
'''
##### # #
@ -23970,7 +23976,7 @@ class _Debugger:
def _choose_auto_watches(self, my_locals):
old_theme = theme()
theme(COLOR_SCHEME)
theme(_Debugger.DEBUGGER_MAIN_WINDOW_THEME)
num_cols = 3
output_text = ''
num_lines = 2
@ -23998,7 +24004,7 @@ class _Debugger:
layout += [
[Ok(), Cancel(), Button('Clear All'), Button('Select [almost] All', key='-AUTO_SELECT-')]]
window = Window('All Locals', layout, icon=PSG_DEBUGGER_LOGO, finalize=True)
window = Window('Choose Watches', layout, icon=PSG_DEBUGGER_LOGO, finalize=True, keep_on_top=True)
while True: # event loop
event, values = window.read()
@ -24053,7 +24059,7 @@ class _Debugger:
if self.popout_window: # if floating window already exists, close it first
self.popout_window.Close()
old_theme = theme()
theme(DEBUGGER_POPOUT_THEME)
theme(_Debugger.DEBUGGER_POPOUT_THEME)
num_cols = 2
width_var = 15
width_value = 30
@ -24070,10 +24076,10 @@ class _Debugger:
for key in self.popout_choices:
if self.popout_choices[key] is True:
value = str(self.locals.get(key))
h = min(len(value) // width_value + 1, MAX_LINES_PER_RESULT_FLOATING)
line += [Text('{}'.format(key), size=(width_var, 1), font=POPOUT_WINDOW_FONT),
Text(' = ', font=POPOUT_WINDOW_FONT),
Text(value, key=key, size=(width_value, h), font=POPOUT_WINDOW_FONT)]
h = min(len(value) // width_value + 1, _Debugger.MAX_LINES_PER_RESULT_FLOATING)
line += [Text('{}'.format(key), size=(width_var, 1), font=_Debugger.DEBUGGER_POPOUT_WINDOW_FONT),
Text(' = ', font=_Debugger.DEBUGGER_POPOUT_WINDOW_FONT),
Text(value, key=key, size=(width_value, h), font=_Debugger.DEBUGGER_POPOUT_WINDOW_FONT)]
if col + 1 < num_cols:
line += [VerticalSeparator(), T(' ')]
col += 1
@ -26244,4 +26250,4 @@ if __name__ == '__main__':
exit(0)
main()
exit(0)
#72a37da2ed2698572ff1dd1ff7c3117548c6d90f24a80357f9ab68bf2ce2631e77578781d2a862823b929a07256888312fd4d577981e55c841544ea2aa0705867d41371f9b5ebf3e779fa0af4dee1bbacc65e6c4c8f8524a881eebb41121b3664966154f6346594dd364552465cd951eae92dfd878fb092ebc3885e4186537addeca75a45074d7027d7c91c0a9f294770d35757a46164a5d33e16f18eac7ca661fc184cc68d2d9204e34b01ad877ac4aadb020bf86e36decdeb51417866aa9e03a9ee34902c9ed84f604f15267cdfd6d4dc75bb0cd7b989c4552941a91ec3fecfa7abc13c179cfcbc943ca197f42d602c22966e40eb4230381a12da8d5a8c9c1ba31c8a857cbb3376a7d046b5e27567680abc2c10f4fde972371fd8b3005fc536f998834139061bfe8291aa641c767cd6996d7684d36bf388da4ea8ff26685625f4c757520df5772af2d2e1029009562628aad1acdc91d924269eb44d6e1427ffda09c46e44dcfac8bf46d3cd8139c20109e61966695176386ff8fd289ef9d62419824283ba656b9e744ad49eb0345375e1d3cefbc11c2a09f4309d9b33edf38de9dbbf2656198459b5bd051b18b1dc8ccd5edc87fe45b85e6b083b52c1748e16f4952609278705daa1475b83669922dd1168db67b4ea7dbfa1526e9bd89f3c30a4334fd198ce05f3dfcc4358cd1682428890d795541fea9b405447ee485d0ff
#33fbe913c63f0fa0f0893ef55e3f6af4895e599092b2f002692e055f221a53df9b32f5642ce0d85df2d6f7a8eb74aaea23ff3e3b7b60db9bb7746ea8383c9a3c9950c8a1eef3573bd88760d605dd513dee435968c36503c87cc5ae59e2bc32406922fc801a2ce114f12134c6fdc40207a08a93164c44591824222cd0fd6eb7e13255257ba3359d2d2026c8404e351949788c32d159018219ac53b5ca362e86c0c8d6e44158ee39d142f6b2326d16c1616ca86e2f17299d2df53dedd7af1a7f7ff5ed61aa78881f3f4ecf612ca5b170c780122bb4c7cd53dfe3cb421bd78b1748f611b3de86357a98e0258e08480b8d0e3a81978565a11db28a2ba288e6f1271b01b93561e35e7aa1107801896afd249b9ba60c5557bf1040656c6e6d790a72f6dfeedf5cf4b7270e90a897e5b86964bf1c87f6c3c49f2df6e6474f2b4397c2804d16b69d289440e8763373ed5fd73f967203e65b0aec8ef83add0a286c41c4d324faa94b0dd1fd6b0f49ab61755317a954dada3b2661e24afef5cc9721f6ac9a8468b0b051c98993202e4dabb0607dc98720712adc9f567613d3237491a7933881a7efa57f2ff6776b6d49674c24e334ce3d6a006d2b5e7e0d9c6b5253688bd86ba462bd2df37b5ece8a1050b9379f9da0e0fea97868eaaff566d2f5ad34f71456495138244bf983be36be53a90ecc1c2b712bdb123391296a7c770bfff48590