81 lines
3.8 KiB
Python
81 lines
3.8 KiB
Python
import PySimpleGUI as sg
|
|
import sys
|
|
import pyfiglet
|
|
|
|
"""
|
|
Demo pyfiglet integration
|
|
|
|
Adapted from code originally from this fantastic repository:
|
|
https://github.com/nycynik/ascii-font-processor
|
|
Thank you nycynik for a fantastic headstart
|
|
|
|
If you are running PySimpleGUI before verion 4.35.0.11, then you'll get an error
|
|
message saying there is a problem with: bound method Multiline.__del__
|
|
It's because a newer parm is used in this code. It'll all still work just fine with this error.
|
|
|
|
This demo has an interesting little trick. If the window is resized, then it
|
|
will use the new size of the Multiline element to compute the numiber of characters
|
|
wide the Multiline has to work with. This number is passed to the figlet renderer.
|
|
|
|
Copyright 2021 PySimpleGUI
|
|
"""
|
|
|
|
|
|
def draw_text(font, text, width=80):
|
|
"""Simple wrapper for the main draw function"""
|
|
|
|
return pyfiglet.Figlet(font=font, width=width).renderText(text)
|
|
|
|
def main():
|
|
selected_font = 'computer'
|
|
LINE_LENGTH = 100
|
|
MULTILINE_FONT = ('Courier', 12)
|
|
fonts = pyfiglet.FigletFont.getFonts()
|
|
column_left = [[sg.Table(headings=['Font Name'], values=fonts, key='-FONT-LIST-',
|
|
col_widths=[40], num_rows=30, enable_events=True), sg.VerticalSeparator(pad=((5, 5), 0))]]
|
|
|
|
try:
|
|
mline_input = sg.Multiline('PySimpleGUI', size=(40,3), key='-TEXT-TO-SHOW-', no_scrollbar=True, enable_events=True, focus=True)
|
|
except Exception as e:
|
|
mline_input = sg.Multiline('PySimpleGUI', size=(40,3), key='-TEXT-TO-SHOW-', enable_events=True, focus=True)
|
|
|
|
column_right = [[sg.Text("Font Name:", size=(10,1)), sg.Input(selected_font, size=(12,1), key='-FONT-NAME-')],
|
|
[sg.Text("Text:", size=(10,1)), mline_input, sg.T('Font size for display below'), sg.Combo(list(range(4,20)), 12, enable_events=True, k='-FONT-SIZE-')],
|
|
[sg.Multiline(size=(LINE_LENGTH, 20), key='-OUTPUT-', font=MULTILINE_FONT)],]
|
|
|
|
layout = [[sg.Column(column_left), sg.Column(column_right, expand_x=True, expand_y=True)],
|
|
[sg.Button('Exit'), sg.T('PySimpleGUI ver ' + sg.version.split(' ')[0] + ' tkinter ver ' + sg.tclversion_detailed + ' Python ver ' + sys.version, font='Default 8', pad=(0,0))],]
|
|
|
|
window = sg.Window('Figlet-Me', layout, resizable=True, finalize=True, right_click_menu=['_', ['Edit Me']])
|
|
|
|
window['-OUTPUT-'].expand(True, True, expand_row=True)
|
|
window['-OUTPUT-'].update(draw_text(selected_font, 'PySimpleGUI').strip())
|
|
|
|
while True: # Event Loop
|
|
event, values = window.read()
|
|
# print(event,values)
|
|
if event == sg.WIN_CLOSED or event == 'Exit':
|
|
break
|
|
if event == '-FONT-SIZE-':
|
|
MULTILINE_FONT = (MULTILINE_FONT[0], values['-FONT-SIZE-'])
|
|
window['-OUTPUT-'].update(font=MULTILINE_FONT)
|
|
window.refresh()
|
|
elif event == '-FONT-LIST-':
|
|
# first one is the selected, no multi-select allowed.
|
|
selected_font = fonts[values['-FONT-LIST-'][0]]
|
|
window['-FONT-NAME-'].update(selected_font)
|
|
elif event == 'Edit Me':
|
|
sg.execute_editor(__file__)
|
|
if event in ('Show', '-TEXT-TO-SHOW-', '-FONT-SIZE-', '-FONT-LIST-'):
|
|
text = values['-TEXT-TO-SHOW-']
|
|
if text.strip() == '':
|
|
text = selected_font.strip()
|
|
# fancy way of detecting the size of the multiline so the window can be resized
|
|
# line_length = window["-OUTPUT-"].get_size()[0] // sg.Text.char_width_in_pixels(MULTILINE_FONT)
|
|
line_length = window["-OUTPUT-"].get_size()[0] // sg.tkinter.font.Font(font=MULTILINE_FONT).measure('A')
|
|
window['-OUTPUT-'].update(draw_text(selected_font, text, line_length).rstrip())
|
|
|
|
window.close()
|
|
|
|
if __name__ == "__main__":
|
|
main() |