PySimpleGUI/Demo Recipes.py

174 lines
8.1 KiB
Python

import time
from random import randint
import random
import string
import PySimpleGUI as SG
def SourceDestFolders():
with SG.FlexForm('Demo Source / Destination Folders', auto_size_text=True) as form:
form_rows = [[SG.Text('Enter the Source and Destination folders')],
[SG.Text('Source Folder', size=(15, 1), auto_size_text=False, justification='right'), SG.InputText('Source')],
[SG.Text('Destination Folder', size=(15, 1), auto_size_text=False, justification='right'), SG.InputText('Dest'), SG.FolderBrowse()],
[SG.Submit(), SG.Cancel()]]
button, (source, dest) = form.LayoutAndShow(form_rows)
if button == 'Submit':
# do something useful with the inputs
SG.MsgBox('Submitted', 'The user entered source:', source, 'Destination folder:', dest, 'Using button', button)
else:
SG.MsgBoxError('Cancelled', 'User Cancelled')
def Everything_NoContextManager():
form = SG.FlexForm('Everything bagel', auto_size_text=True, default_element_size=(40, 1))
layout = [[SG.Text('All graphic widgets in one form!', size=(30, 1), font=("Helvetica", 25), text_color='blue')],
[SG.Text('Here is some text.... and a place to enter text')],
[SG.InputText()],
[SG.Checkbox('My first checkbox!'), SG.Checkbox('My second checkbox!', default=True)],
[SG.Radio('My first Radio!', "RADIO1", default=True), SG.Radio('My second Radio!', "RADIO1")],
[SG.Multiline(default_text='This is the default Text should you decide not to type anything', scale=(2, 10))],
[SG.InputCombo(['choice 1', 'choice 2'], size=(20, 3))],
[SG.Text('_' * 100, size=(70, 1))],
[SG.Text('Choose Source and Destination Folders', size=(35, 1))],
[SG.Text('Source Folder', size=(15, 1), auto_size_text=False), SG.InputText('Source'), SG.FolderBrowse()],
[SG.Text('Destination Folder', size=(15, 1), auto_size_text=False), SG.InputText('Dest'), SG.FolderBrowse()],
[SG.SimpleButton('Your very own button', button_color=('white', 'green'))],
[SG.Submit(), SG.Cancel()]]
button, (values) = form.LayoutAndShow(layout)
SG.MsgBox('Title', 'Typical message box', 'Here are the restults! There is one entry per input field ', 'The button clicked was "{}"'.format(button), 'The values are', values)
def Everything():
with SG.FlexForm('Everything bagel', auto_size_text=True, default_element_size=(40, 1)) as form:
layout = [[SG.Text('All graphic widgets in one form!', size=(30, 1), font=("Helvetica", 25), text_color='blue')],
[SG.Text('Here is some text.... and a place to enter text')],
[SG.InputText()],
[SG.Checkbox('My first checkbox!'), SG.Checkbox('My second checkbox!', default=True)],
[SG.Radio('My first Radio!', "RADIO1", default=True), SG.Radio('My second Radio!', "RADIO1")],
[SG.Spin(values=(1,2,3), initial_value=1, size=(2,1)), SG.T('Spinner 1', size=(20,1)),
SG.Spin(values=(1,2,3), initial_value=1, size=(2,1)),SG.T('Spinner 2')],
[SG.Multiline(default_text='This is the default Text should you decide not to type anything', scale=(2, 10))],
[SG.InputCombo(['choice 1', 'choice 2'], size=(20, 3))],
[SG.Text('_' * 100, size=(70, 1))],
[SG.Text('Choose Source and Destination Folders', size=(35, 1))],
[SG.Text('Source Folder', size=(15, 1), auto_size_text=False), SG.InputText('Source'), SG.FolderBrowse()],
[SG.Text('Destination Folder', size=(15, 1), auto_size_text=False), SG.InputText('Dest'), SG.FolderBrowse()],
[SG.SimpleButton('Custom Button', button_color=('white', 'green'))],
[SG.Submit(), SG.Cancel()]]
button, (values) = form.LayoutAndShow(layout)
SG.MsgBox('Title', 'Typical message box', 'The results of the form are a lot of data! Get ready... ', 'The button clicked was "{}"'.format(button), 'The values are', values)
def ProgressMeter():
for i in range(1,10000):
if not SG.EasyProgressMeter('My Meter', i+1, 10000): break
def RunningTimer():
with SG.FlexForm('Running Timer', auto_size_text=True) as form:
output_element = SG.Text('', size=(8, 2), font=('Helvetica', 20))
form_rows = [[SG.Text('Non-blocking GUI with updates')],
[output_element],
[SG.SimpleButton('Quit')]]
form.AddRows(form_rows)
form.Show(non_blocking=True)
for i in range(1, 100):
output_element.Update('{:02d}:{:02d}.{:02d}'.format(*divmod(int(i/100), 60), i%100))
rc = form.Refresh()
if rc is None or rc[0] == 'Quit':
break
time.sleep(.01)
else:
form.CloseNonBlockingForm()
# Persistant form. Does not close when Send button is clicked.
# Normally all Simple Buttons cause forms to close
def ChatBot():
with SG.FlexForm('Chat Window', auto_size_text=True, default_element_size=(30, 2)) as form:
form.AddRow(SG.Text('This is where standard out is being routed', size=[40, 1]))
form.AddRow(SG.Output(size=(80, 20)))
form.AddRow(SG.Multiline(size=(70, 5), enter_submits=True), SG.ReadFormButton('SEND', button_color=(SG.YELLOWS[0], SG.BLUES[0])), SG.SimpleButton('EXIT', button_color=(SG.YELLOWS[0], SG.GREENS[0])))
button, value = form.Read()
# ---===--- Loop taking in user input and using it to query HowDoI web oracle --- #
while True:
if button == 'SEND':
print(value)
else:
break
button, value = form.Read()
def NonBlockingPeriodicUpdateForm_ContextManager():
# Show a form that's a running counter
with SG.FlexForm('Running Timer', auto_size_text=True) as form:
output_element = SG.Text('',size=(10,2), font=('Helvetica', 20), text_color='red', justification='center')
form_rows = [[SG.Text('Non blocking GUI with updates', justification='center')],
[output_element],
[SG.T(' '*15), SG.Quit()]]
form.AddRows(form_rows)
form.Show(non_blocking=True)
for i in range(1,500):
output_element.Update('{:02d}:{:02d}.{:02d}'.format(*divmod(int(i/100), 60), i%100))
rc = form.Refresh()
if rc is None: # if user closed the window using X
break
button, values = rc
if button == 'Quit':
break
time.sleep(.01)
else:
# if the loop finished then need to close the form for the user
form.CloseNonBlockingForm()
def NonBlockingPeriodicUpdateForm():
# Show a form that's a running counter
form = SG.FlexForm('Running Timer', auto_size_text=True)
output_element = SG.Text('',size=(8,2), font=('Helvetica', 20))
form_rows = [[SG.Text('Non blocking GUI with updates')],
[output_element],
[SG.Quit()]]
form.AddRows(form_rows)
form.Show(non_blocking=True)
for i in range(1,50000):
output_element.Update(f'{(i/100)/60:02d}:{(i/100)%60:02d}.{i%100:02d}')
rc = form.Refresh()
if rc is None or rc[0] == 'Quit': # if user closed the window using X or clicked Quit button
break
time.sleep(.01)
else:
# if the loop finished then need to close the form for the user
form.CloseNonBlockingForm()
def DebugTest():
# SG.Print('How about we print a bunch of random numbers?', , size=(90,40))
for i in range (1,300):
SG.Print(i, randint(1, 1000), end='', sep='-')
# SG.PrintClose()
def main():
SG.SetOptions(border_width=1, element_padding=(4,6), font=("Helvetica", 10), button_color=('white', SG.BLUES[0]),
progress_meter_border_depth=0)
SourceDestFolders()
Everything()
NonBlockingPeriodicUpdateForm_ContextManager()
ProgressMeter()
ChatBot()
DebugTest()
if __name__ == '__main__':
main()
exit(69)