66
77import PySimpleGUI as sg
88import sys
9- import os
109import pyfiglet
1110
12- version = '6.1'
11+ version = '6.1.1 '
1312__version__ = version .split ()[0 ]
1413
1514"""
21206.0.1 10-Apr-2026 Made Font list expand/contract with window. Sort favorites.
22216.0.2 15-Jun-2026 Added filtering of the font list to make finding fonts much easier.
23226.1 17-Jun-2026 Preparing for PyPI release
23+ 6.1.1 25-Jun-2026 Added removing a font from the favorites list
24+ Made resizing of window work better
25+ Added option to prepend "#" onto front of each line with
26+ Navigating with arrow keys while in font list will select fonts so that previewing can be done quickly
2427"""
2528
2629
@@ -113,54 +116,62 @@ def change_theme(location):
113116 return None
114117
115118
116- def draw_text (font , text , width = 80 ):
119+ def draw_text (font , text , width = 80 , prepend_hash = False ):
117120 """Simple wrapper for the main draw function"""
118-
119- return pyfiglet .Figlet (font = font , width = width ).renderText (text )
120-
121+ text = pyfiglet .Figlet (font = font , width = width ).renderText (text )
122+ if prepend_hash :
123+ lines = text .split ('\n ' )
124+ new_lines = []
125+ for line in lines :
126+ new_lines .append (f'# { line } ' )
127+ text = '\n ' .join (new_lines )
128+ return text
121129
122130def make_window ():
123- selected_font = DEFAULT_FONT
131+ # selected_font = DEFAULT_FONT
124132 LINE_LENGTH = 100
125133 MULTILINE_FONT = ('Courier' , 12 )
126134 fonts = pyfiglet .FigletFont .getFonts ()
127- favorite_fonts = sg .user_settings_get_entry ('-favorites-' , [' ' ])
128- if len (favorite_fonts ) == 0 :
129- favorite_fonts = [' ' ]
130- sg .theme_background_color (sg .theme_input_background_color ())
131- sg .theme_text_element_background_color (sg .theme_input_background_color ())
135+ favorite_fonts = sg .user_settings_get_entry ('-favorites-' , ['' ])
136+ last_used_font = sg .user_settings_get_entry ('-FONT-NAME-' , '' )
137+ # sg.theme_background_color(sg.theme_input_background_color())
138+ # sg.theme_text_element_background_color(sg.theme_input_background_color())
132139 # column_left = [[sg.Table(headings=['Font Name'], values=fonts, key='-FONT-LIST-',
133140 # col_widths=[40], num_rows=30, enable_events=True, expand_y=True), sg.VerticalSeparator(pad=((5, 5), 0))],
134141 # [sg.Input(s=20, k='-FILTER-')],[ sg.T('Filter')]]
135142 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 ))],
136143 [sg .Input (s = 20 , k = '-FILTER-' , enable_events = True )],[ sg .T ('Filter' , justification = 'c' , k = '-FILTER-' )]]
137144 mline_input = sg .Multiline ('PySimpleGUI' , size = (40 , 3 ), key = '-TEXT-TO-SHOW-' , enable_events = True , focus = True )
138145
139- column_right = [[sg .Combo (favorite_fonts , default_value = favorite_fonts [0 ], 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 (selected_font , size = (12 , 1 ), key = '-FONT-NAME-' ), sg .B ('Add to favorites' , k = '-ADD TO FAVORITES-' ), sg .B ('Clear favorites' , k = '-CLEAR FAVORITES-' )],
140- [sg .Text ("Text:" , size = (10 , 1 )), mline_input , sg .T ('Font size for display below' ),
141- sg .Combo (list (range (4 , 20 )), 12 , enable_events = True , k = '-FONT-SIZE-' )],
146+ 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-' )],
147+ [sg .Text ("Text:" ), mline_input ,
148+ sg .Column ([[sg .T ('Font size for display below' ), sg .Combo (list (range (4 , 20 )), 12 , enable_events = True , k = '-FONT-SIZE-' )],
149+ [sg .Checkbox ('Prepend # onto front of each line' , setting = False , k = '-PREPEND COMMENT-' , enable_events = True )]])],
142150 [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 ,)],
143151 [sg .B ('Copy to Clipboard' ), sg .B ('Change Theme' )], ]
144152
145- layout = [[sg .Column (column_left , expand_y = True , expand_x = False ), sg .Column (column_right , expand_x = False , expand_y = False , k = '-COL R-' )],
153+ layout = [[sg .Column (column_left , expand_y = False , expand_x = False ), sg .Column (column_right , expand_x = True , expand_y = True , k = '-COL R-' )],
146154 [sg .Button ('Exit' , right_click_menu = sg .MENU_RIGHT_CLICK_DISABLED ),
147155 sg .T ('PySimpleGUI ver ' + sg .version .split (' ' )[0 ] + ' tkinter ver ' + sg .tclversion_detailed + ' Python ver ' + sys .version , font = 'Default 8' ,
148156 pad = (0 , 0 ))], ]
149157 layout [- 1 ].append (sg .Sizegrip ())
150158
151159 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=='
152160
153- try :
154- favorite_fonts .remove (' ' )
155- except :
156- pass
157161
158- window = sg .Window ('psgfiglet' , layout , resizable = True , finalize = True , right_click_menu = ['_' , ['Edit Me' , 'Copy' , 'File Location' ,'Exit' ]], icon = icon , auto_save_location = True )
162+
163+ window = sg .Window ('psgfiglet' , layout , resizable = True , finalize = True , right_click_menu = ['_' , ['Edit Me' , 'Copy' , 'File Location' ,'Exit' ]], icon = icon , auto_save_location = True , enable_close_attempted_event = True )
164+
165+ window .settings_restore ()
159166
160167 window ['-COL R-' ].expand (True , True , True )
161168 # window['-OUTPUT-'].expand(True, True, False)
162169 # window['-FONT-LIST-'].expand(False, False, False)
163- window ['-OUTPUT-' ].update (draw_text (selected_font , 'PySimpleGUI' ).strip ())
170+ initial_font = window ['-FONT-NAME-' ].get ()
171+ initial_font = DEFAULT_FONT if not initial_font else initial_font # if blank font, then use default
172+ window ['-OUTPUT-' ].update (draw_text (initial_font , 'PySimpleGUI' ).strip ())
173+ window ['-FONT-LIST-' ].bind ('<Down>' , '+DOWN' )
174+ window ['-FONT-LIST-' ].bind ('<Up>' , '+UP' )
164175 return window
165176
166177
@@ -175,16 +186,17 @@ def main():
175186 # sg.theme_background_color('#36393F')
176187 # sg.theme_input_text_color('white')
177188 window = make_window ()
178- selected_font = DEFAULT_FONT
179189 MULTILINE_FONT = ('Courier' , 12 )
180190 fonts = pyfiglet .FigletFont .getFonts ()
181- favorite_fonts = sg .user_settings_get_entry ('-favorites-' , [' ' ])
191+ favorite_fonts = sg .user_settings_get_entry ('-favorites-' , ['' ])
192+ favorite_fonts = [x for x in favorite_fonts if x .strip ()]
182193 favorite_fonts .sort ()
183194
184195 while True : # Event Loop
185196 event , values = window .read ()
186- print (event ,values )
187- if event == sg .WIN_CLOSED or event == 'Exit' :
197+ # print(event,values)
198+ if event in ('Exit' , sg .WIN_CLOSED , sg .WINDOW_CLOSE_ATTEMPTED_EVENT ):
199+ window .settings_save (values )
188200 break
189201 if event == '-FONT-SIZE-' :
190202 MULTILINE_FONT = (MULTILINE_FONT [0 ], values ['-FONT-SIZE-' ])
@@ -194,24 +206,32 @@ def main():
194206 #first one is the selected, no multi-select allowed.
195207 selected_font = values ['-FONT-LIST-' ][0 ]
196208 window ['-FONT-NAME-' ].update (selected_font )
197-
209+ values [ '-FONT-NAME-' ] = selected_font
198210 elif event == 'Edit Me' :
199211 sg .execute_editor (__file__ )
200212 elif event == 'File Location' :
201213 sg .popup_scrolled ('This Python file is:' , __file__ )
202214 elif event == '-FAVORITES-' :
203215 selected_font = values ['-FAVORITES-' ]
204216 window ['-FONT-NAME-' ].update (selected_font )
217+ values ['-FONT-NAME-' ] = selected_font
218+ elif event .endswith (('+DOWN' , '+UP' )): # if using arrow keys in the list of fonts
219+ index = window ['-FONT-LIST-' ].widget .index (sg .tk .ACTIVE )
220+ selected_font = fonts [index ]
221+ window ['-FONT-LIST-' ].update (set_to_index = index )
222+ window ['-FONT-NAME-' ].update (selected_font )
223+ values ['-FONT-NAME-' ] = selected_font
205224
206225 # Show the new figlet if something changed
207- if event in ('Show' , '-TEXT-TO-SHOW-' , '-FONT-SIZE-' , '-FONT-LIST-' , '-FAVORITES-' ):
226+ if event in ('Show' , '-TEXT-TO-SHOW-' , '-FONT-SIZE-' , '-FONT-LIST-' , '-FAVORITES-' , '-PREPEND COMMENT-' , '-FONT-LIST-+UP' , '-FONT-LIST-+DOWN' ):
208227 text = values ['-TEXT-TO-SHOW-' ]
228+ selected_font = values ['-FONT-NAME-' ]
209229 if text .strip () == '' :
210230 text = selected_font .strip ()
211231 # fancy way of detecting the size of the multiline so the window can be resized
212232 # line_length = window["-OUTPUT-"].get_size()[0] // sg.Text.char_width_in_pixels(MULTILINE_FONT)
213233 line_length = window ["-OUTPUT-" ].get_size ()[0 ] // sg .tkinter .font .Font (font = MULTILINE_FONT ).measure ('A' )
214- window ['-OUTPUT-' ].update (draw_text (selected_font , text , line_length ).rstrip ())
234+ window ['-OUTPUT-' ].update (draw_text (selected_font , text , line_length , prepend_hash = values [ '-PREPEND COMMENT-' ] ).rstrip ())
215235 elif event .startswith ('Copy' ):
216236 sg .clipboard_set (window ['-OUTPUT-' ].get ())
217237 elif event == 'Change Theme' :
@@ -224,6 +244,11 @@ def main():
224244 favorite_fonts .sort ()
225245 sg .user_settings_set_entry ('-favorites-' , favorite_fonts )
226246 window ['-FAVORITES-' ].update (value = values ['-FONT-NAME-' ], values = favorite_fonts )
247+ elif event == '-REMOVE FROM FAVORITES-' :
248+ favorite_fonts .remove (values ['-FONT-NAME-' ])
249+ sg .user_settings_set_entry ('-favorites-' , favorite_fonts )
250+ value = favorite_fonts [0 ] if len (favorite_fonts ) else ''
251+ window ['-FAVORITES-' ].update (value = value , values = favorite_fonts )
227252 elif event == '-CLEAR FAVORITES-' :
228253 favorite_fonts = []
229254 sg .user_settings_set_entry ('-favorites-' , favorite_fonts )
@@ -234,6 +259,9 @@ def main():
234259 else :
235260 font_list = list (font for font in fonts if values [event ] in font )
236261 window ['-FONT-LIST-' ].update (font_list )
262+
263+
264+
237265 window .close ()
238266
239267if __name__ == '__main__' :
0 commit comments