Skip to content

Commit 54830b4

Browse files
committed
Changed favorites interface from Combo to Listbox for easy previewing
1 parent 225b1c9 commit 54830b4

1 file changed

Lines changed: 48 additions & 29 deletions

File tree

psgfiglet/psgfiglet.py

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import sys
99
import pyfiglet
1010

11-
version = '6.1.4'
11+
version = '6.1.5'
1212
__version__ = version.split()[0]
1313

1414
"""
@@ -28,6 +28,7 @@
2828
6.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.
3030
6.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

134135
def 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

Comments
 (0)