88import sys
99import pyfiglet
1010
11- version = '6.1.4 '
11+ version = '6.1.5 '
1212__version__ = version .split ()[0 ]
1313
1414"""
28286.1.3 26-Jun-2026 Added use of new method Listbox.get_active_index rather than directly accessing tkinter widget. Included code
2929 to fallback to use widget if the new method isn't found in PySimpleGUI.
30306.1.4 27-Jun-2026 Strip whitespace from figlet to reduce extra blank lines at the end
31+ 6.1.5 28-Jun-2026 Changed favorites from Combo to Listbox so that it too can be previewed using arrow keys
3132"""
3233
3334
@@ -132,32 +133,34 @@ def draw_text(font, text, width=80, prepend_hash=False):
132133 return text
133134
134135def make_window ():
135- # selected_font = DEFAULT_FONT
136136 LINE_LENGTH = 100
137137 MULTILINE_FONT = ('Courier' , 12 )
138138 fonts = pyfiglet .FigletFont .getFonts ()
139139 favorite_fonts = sg .user_settings_get_entry ('-favorites-' , ['' ])
140140 last_used_font = sg .user_settings_get_entry ('-FONT-NAME-' , '' )
141- # sg.theme_background_color(sg.theme_input_background_color())
142- # sg.theme_text_element_background_color( sg.theme_input_background_color())
143- # column_left = [[ sg.Table(headings=['Font Name'], values=fonts, key='-FONT-LIST-',
144- # col_widths=[40], num_rows=30, enable_events=True, expand_y=True ), sg.VerticalSeparator(pad=((5, 5), 0) )],
145- # [sg.Input(s=20, k='-FILTER-')],[ sg.T('Filter')]]
146- column_left = [[ sg . Listbox ( values = fonts , key = '-FONT-LIST-' , s = ( 30 , 30 ), justification = 'r' , enable_events = True , expand_y = True , expand_x = True ), sg .VerticalSeparator (pad = ((5 , 5 ), 0 ))],
141+
142+ column_left = [[ sg .Col ([[ sg .P (), sg . T ( 'Fonts' ), sg . P ()],
143+ [ sg .Listbox ( values = fonts , key = '-FONT-LIST-' , s = ( max ([ len ( f ) + 1 for f in fonts ]), 30 ), justification = 'r' , enable_events = True , ), sg . VerticalSeparator ( pad = (( 5 , 5 ), 0 )), sg . P ()]], expand_y = True ) ,
144+ sg . Col ([[ sg . P ( ), sg .T ( 'Favorites' ), sg . P ( )],
145+ [sg .Listbox ( values = favorite_fonts , default_values = [ last_used_font ], key = '-FAVORITES-' , s = ( max ([ len ( f ) + 1 for f in favorite_fonts ]), 30 ), justification = 'r' , enable_events = True ),
146+ sg .VerticalSeparator (pad = ((5 , 5 ), 0 ))]]), sg . P ( )],
147147 [sg .Input (s = 20 , k = '-FILTER-' , enable_events = True )],[ sg .T ('Filter' , justification = 'c' , k = '-FILTER-' )]]
148+
148149 mline_input = sg .Multiline ('PySimpleGUI' , size = (40 , 3 ), key = '-TEXT-TO-SHOW-' , enable_events = True , focus = True )
149150
150- column_right = [[sg .Combo (favorite_fonts , default_value = last_used_font , readonly = True , enable_events = True , k = '-FAVORITES-' , size = (max ([len (f ) for f in favorite_fonts ]),30 )), sg .Text ("Font Name:" , size = (10 , 1 )), sg .Input (setting = DEFAULT_FONT , size = (12 , 1 ), key = '-FONT-NAME-' ), sg .B ('Add to favorites' , k = '-ADD TO FAVORITES-' ), sg .B ('Remove from favorites' , k = '-REMOVE FROM FAVORITES-' ), sg .B ('Clear favorites' , k = '-CLEAR FAVORITES-' )],
151+ column_right = [[
152+ sg .Text ("Font Name:" , size = (10 , 1 )), sg .Input (setting = DEFAULT_FONT , size = (12 , 1 ), key = '-FONT-NAME-' ), sg .B ('Add to favorites' , k = '-ADD TO FAVORITES-' ), sg .B ('Remove from favorites' , k = '-REMOVE FROM FAVORITES-' ), sg .B ('Clear favorites' , k = '-CLEAR FAVORITES-' )],
151153 [sg .Text ("Text:" ), mline_input ,
152154 sg .Column ([[sg .T ('Font size for display below' ), sg .Combo (list (range (4 , 20 )), 12 , enable_events = True , k = '-FONT-SIZE-' )],
153155 [sg .Checkbox ('Prepend # onto front of each line' , setting = False , k = '-PREPEND COMMENT-' , enable_events = True )]])],
154- [sg .Multiline (size = (LINE_LENGTH , 20 ), key = '-OUTPUT-' , border_width = 0 , font = MULTILINE_FONT , expand_x = True , expand_y = True , pad = (40 , 40 ), write_only = True ,)],
156+ [sg .Multiline (size = (LINE_LENGTH , 20 ), key = '-OUTPUT-' , border_width = 0 , font = MULTILINE_FONT , pad = (40 , 40 ), write_only = True , )],
155157 [sg .B ('Copy to Clipboard' ), sg .B ('Change Theme' )], ]
156158
157- layout = [[sg .Column (column_left , expand_y = False , expand_x = False ), sg .Column (column_right , expand_x = True , expand_y = True , k = '-COL R-' )],
159+ layout = [[sg .Column (column_left , k = '-COL L-' ), sg .Column (column_right , k = '-COL R-' )],
158160 [sg .Button ('Exit' , right_click_menu = sg .MENU_RIGHT_CLICK_DISABLED ),
159161 sg .T ('PySimpleGUI ver ' + sg .version .split (' ' )[0 ] + ' tkinter ver ' + sg .tclversion_detailed + ' Python ver ' + sys .version , font = 'Default 8' ,
160162 pad = (0 , 0 ))], ]
163+
161164 layout [- 1 ].append (sg .Sizegrip ())
162165
163166 icon = b'iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAH+UExURf/YAL2gAJB5AMysAP7XAG5dAAAAAAcFAEM4AHxpAPHMALKWACUfABQQAJiAAH9rAEA2AMurAO7JAFJFAMqrACQeACMdALWZAAsJAPbQAKGIAMipAKKJAJqCALebAGtaAAoIAD0zAG9eABgUAEs/AFVIAJV+AHhlAFFEABwXACchAMeoAOC9AKaMAGFSAOzHAAQDAPvUALGVAFlLANCwAN68ADAoAOfDAIl0ACojALOXALqdAGlYALibADcuAJZ/AJ6FAHZjANOyAFNGAA8MADEpAEQ5AAkHAHpnANi2AKyRAAYFAPzVAIBsAEo+AFBDAI95ABANANa1ACAbAPTOAPLMAOTBAE1BACwlABsWACskAEI3AFpMAHFfAIhzAMGjAGVVAAEAAEE3AGNTAKuQAPjSAH1pAB4ZAPPNAK2SAMCiAMWmAN27AIt1APXPACghACEbAL+hAA4LAFRHAHdkAJuDAMmqACYgAEk9AFxNAIFtAI54AI13AAwKAKqQAE9CANKxAKeNAObCAK6TAGxbANy6AHtoAMSmAD81AF1OANW0APnSAOPAAGZWAKmPAO3IAOXBAFhKADoxAOK/AO/KAGBRAIx2ABYSABEOAAUEAJJ7AGRUAHBeAHJgAJyEALmcAFdJAIZxANGxAKOKAAMCADsxACIcALaaAL6gAOG+AFD17/gAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALDSURBVFhH7df5W0xhFAfwS3VHUkpMqQYZ00Ixxq5FIYxMaLFEUhTJMhGFyDItpkRMdtm3/9Lcc78z7oy7vvc+jx/M55fe855zvs/TU93ucAkJ/8acuUk4WSI5hed527zU+ajNSlsQzhOkZ+DGnIWIE2Rm4ZLdomxkibJxzWzxEiSBHfescnIRFLUUHTZ5SJHIR4tJAUKkHOixWIaMGMvRZJC0AhkxCtFlsBIRsZzoMlglJriKiktKxSNBl8FqMWCNcC4rX+sUS34dNVm4xYD1KDnPBqo3ojRsE63zm1EKtmzdxvPbURhWIQZWooSq6h04GZYhBtagNK9WDNyJ0rxdlLcblQXqKHAPKgvspcB9qMzzUh5fhdK8/ZRXfwCleT4KbEBlgYMUeAiVBQ5ToHW/hY2U14TKpOaWliOpFBj3h8zg6LHjcf843aWtJ062nSpoL0vGjBGnkSKro6nzzNkuTOrTjVVl585jVJcibCmrxaQ+PdhSdgGT+vRiS1FJMyb1uYg1RZcwqNNlrMlIv+K08f4+DEY04quSq9iWqLvWf73CK36ffz10bvBtOMkT36IHqgdvpty67RgSila05IXfk+/cxVkbvTOoj/uFkeF7qDTQ/7tMFPLuCyNh/Q9woeYhjao/+ztpRhDw4krRCD0JR1HJG6MscKXhVl5voTA0jkrBI0qKsvuCaMSZ8FTaacKt/qSepKEY9sdTT9CNeDo1bUOXz8OdglGMxXnWXZOT9XyC40Ij+Y6ZAdwKXmBRyUvMyXv1GocozYdUHwZ1msGaijcY1eUtllS9w7AO77GioRjjmnxY0CT9FK3CwKvHbD12VPg/YFiX4DjWFH0MYVSvTzKPZYkhjBkQUvnZTH/GkDGTPunnwD8G2zHA4EvDV6RE5Lo86DHq8gS+Rd6xOr4HfuDapODPntnysV+oEhIS/jsc9xvWwm7SqLETuAAAAABJRU5ErkJggg=='
@@ -168,14 +171,22 @@ def make_window():
168171
169172 window .settings_restore ()
170173
174+ window ['-OUTPUT-' ].expand (True , True , True )
171175 window ['-COL R-' ].expand (True , True , True )
172- # window['-OUTPUT-'].expand(True, True, False)
173- # window['-FONT-LIST-'].expand(False, False, False)
176+ # window['-COL L-'].expand(False, True, True)
177+ # window['-COL R-'].expand_row_frame(True, True, True)
178+ # window['-OUTPUT-'].expand_row_frame(True, True, True)
179+ # window['-FONT-LIST-'].expand(True, True, True)
180+ # window['-FONT-LIST-'].expand_row_frame(True, True, True)
181+ # window['-COL L-'].expand(False, True, False)
182+ # window['-COL L-'].expand_row_frame(True, True, True)
174183 initial_font = window ['-FONT-NAME-' ].get ()
175184 initial_font = DEFAULT_FONT if not initial_font else initial_font # if blank font, then use default
176185 window ['-OUTPUT-' ].update (draw_text (initial_font , 'PySimpleGUI' ).strip ())
177186 window ['-FONT-LIST-' ].bind ('<Down>' , '+DOWN' )
178187 window ['-FONT-LIST-' ].bind ('<Up>' , '+UP' )
188+ window ['-FAVORITES-' ].bind ('<Down>' , '+DOWN' )
189+ window ['-FAVORITES-' ].bind ('<Up>' , '+UP' )
179190 return window
180191
181192# ███╗ ███╗ █████╗ ██╗███╗ ██╗
@@ -193,9 +204,6 @@ def main():
193204 # sg.theme('Dark red')
194205 sg .theme (sg .user_settings_get_entry ('-theme-' , 'dark gray 13' ))
195206 # sg.theme('Dark Gray 13')
196- # sg.theme_input_background_color('#36393F')
197- # sg.theme_background_color('#36393F')
198- # sg.theme_input_text_color('white')
199207 window = make_window ()
200208 MULTILINE_FONT = ('Courier' , 12 )
201209 fonts = pyfiglet .FigletFont .getFonts ()
@@ -213,19 +221,19 @@ def main():
213221 MULTILINE_FONT = (MULTILINE_FONT [0 ], values ['-FONT-SIZE-' ])
214222 window ['-OUTPUT-' ].update (font = MULTILINE_FONT )
215223 window .refresh ()
216- elif event == '-FONT-LIST-' :
224+ elif event in ( '-FONT-LIST-' , '-FAVORITES-' ) :
217225 #first one is the selected, no multi-select allowed.
218- selected_font = values ['-FONT-LIST-' ][0 ]
226+ selected_font = values [event ][0 ]
219227 window ['-FONT-NAME-' ].update (selected_font )
220228 values ['-FONT-NAME-' ] = selected_font
221229 elif event == 'Edit Me' :
222230 sg .execute_editor (__file__ )
223231 elif event == 'File Location' :
224232 sg .popup_scrolled ('This Python file is:' , __file__ )
225- elif event == '-FAVORITES-' :
226- selected_font = values ['-FAVORITES-' ]
227- window ['-FONT-NAME-' ].update (selected_font )
228- values ['-FONT-NAME-' ] = selected_font
233+ # elif event == '-FAVORITES-':
234+ # selected_font = values['-FAVORITES-']
235+ # window['-FONT-NAME-'].update(selected_font)
236+ # values['-FONT-NAME-'] = selected_font
229237 elif event in ('-FONT-LIST-+DOWN' , '-FONT-LIST-+UP' ): # if using arrow keys in the list of fonts
230238 try :
231239 index = window ['-FONT-LIST-' ].get_active_index () # New method coming to PSG version 6.3
@@ -236,9 +244,18 @@ def main():
236244 window ['-FONT-LIST-' ].update (set_to_index = index )
237245 window ['-FONT-NAME-' ].update (selected_font )
238246 values ['-FONT-NAME-' ] = selected_font
239-
247+ elif event in ('-FAVORITES-+DOWN' , '-FAVORITES-+UP' ): # if using arrow keys in the list of fonts
248+ try :
249+ index = window ['-FAVORITES-' ].get_active_index () # New method coming to PSG version 6.3
250+ except AttributeError :
251+ # print('Note - get_active_index not found. Using fallback implementation')
252+ index = window ['-FAVORITES-' ].widget .index (sg .tk .ACTIVE )
253+ selected_font = favorite_fonts [index ]
254+ window ['-FAVORITES-' ].update (set_to_index = index )
255+ window ['-FONT-NAME-' ].update (selected_font )
256+ values ['-FONT-NAME-' ] = selected_font
240257 # Show the new figlet if something changed
241- if event in ('Show' , '-TEXT-TO-SHOW-' , '-FONT-SIZE-' , '-FONT-LIST-' , '-FAVORITES-' , '-PREPEND COMMENT-' , '-FONT-LIST-+UP' , '-FONT-LIST-+DOWN' ):
258+ if event in ('Show' , '-TEXT-TO-SHOW-' , '-FONT-SIZE-' , '-FONT-LIST-' , '-FAVORITES-' , '-FAVORITES-+UP' , '-FAVORITES-+DOWN' , '- PREPEND COMMENT-' , '-FONT-LIST-+UP' , '-FONT-LIST-+DOWN' ):
242259 text = values ['-TEXT-TO-SHOW-' ]
243260 selected_font = values ['-FONT-NAME-' ]
244261 if text .strip () == '' :
@@ -258,16 +275,18 @@ def main():
258275 window .close ()
259276 window = make_window ()
260277 elif event == '-ADD TO FAVORITES-' :
261- favorite_fonts .append (values ['-FONT-NAME-' ])
278+ current_font = values ['-FONT-NAME-' ]
279+ favorite_fonts .append (current_font )
262280 favorite_fonts = list (set (favorite_fonts )) # remove dupes
263281 favorite_fonts .sort ()
264282 sg .user_settings_set_entry ('-favorites-' , favorite_fonts )
265- window ['-FAVORITES-' ].update (value = values [ '-FONT-NAME-' ], values = favorite_fonts )
283+ window ['-FAVORITES-' ].update (values = favorite_fonts , set_to_index = favorite_fonts . index ( current_font ) )
266284 elif event == '-REMOVE FROM FAVORITES-' :
267- favorite_fonts .remove (values ['-FONT-NAME-' ])
285+ current_font = values ['-FONT-NAME-' ]
286+ favorite_fonts .remove (current_font )
268287 sg .user_settings_set_entry ('-favorites-' , favorite_fonts )
269- value = favorite_fonts [0 ] if len (favorite_fonts ) else ''
270- window ['-FAVORITES-' ].update (value = value , values = favorite_fonts )
288+ # value = favorite_fonts[0] if len(favorite_fonts) else ''
289+ window ['-FAVORITES-' ].update (values = favorite_fonts )
271290 elif event == '-CLEAR FAVORITES-' :
272291 favorite_fonts = []
273292 sg .user_settings_set_entry ('-favorites-' , favorite_fonts )
0 commit comments