2018-07-18 20:51:29 +00:00
import time
2018-07-21 00:07:04 +00:00
from random import randint
import random
import string
2018-07-18 20:51:29 +00:00
import PySimpleGUI as SG
2018-07-13 15:02:21 +00:00
def SourceDestFolders ( ) :
2018-07-18 20:51:29 +00:00
with SG . FlexForm ( ' Demo Source / Destination Folders ' , auto_size_text = True ) as form :
form_rows = [ [ SG . Text ( ' Enter the Source and Destination folders ' ) ] ,
2018-07-21 00:07:04 +00:00
[ 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 ( ) ] ,
2018-07-18 20:51:29 +00:00
[ SG . Submit ( ) , SG . Cancel ( ) ] ]
2018-07-13 15:02:21 +00:00
2018-07-21 00:07:04 +00:00
button , ( source , dest ) = form . LayoutAndShow ( form_rows )
2018-07-13 15:02:21 +00:00
if button == ' Submit ' :
# do something useful with the inputs
2018-07-21 00:07:04 +00:00
SG . MsgBox ( ' Submitted ' , ' The user entered source: ' , source , ' Destination folder: ' , dest , ' Using button ' , button )
2018-07-13 15:02:21 +00:00
else :
2018-07-18 20:51:29 +00:00
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 ( ) ] ]
2018-07-21 00:07:04 +00:00
button , ( values ) = form . LayoutAndShow ( layout )
2018-07-18 20:51:29 +00:00
2018-07-21 00:07:04 +00:00
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 )
2018-07-18 20:51:29 +00:00
2018-07-13 15:02:21 +00:00
def Everything ( ) :
2018-07-18 20:51:29 +00:00
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 " ) ] ,
2018-07-21 00:07:04 +00:00
[ 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 ' ) ] ,
2018-07-18 20:51:29 +00:00
[ 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 ( ) ] ,
2018-07-21 00:07:04 +00:00
[ SG . SimpleButton ( ' Custom Button ' , button_color = ( ' white ' , ' green ' ) ) ] ,
2018-07-18 20:51:29 +00:00
[ SG . Submit ( ) , SG . Cancel ( ) ] ]
2018-07-13 15:02:21 +00:00
2018-07-21 00:07:04 +00:00
button , ( values ) = form . LayoutAndShow ( layout )
2018-07-13 15:02:21 +00:00
2018-07-18 20:51:29 +00:00
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
2018-07-21 00:07:04 +00:00
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 ( )
2018-07-13 15:02:21 +00:00
2018-07-18 20:51:29 +00:00
# Persistant form. Does not close when Send button is clicked.
# Normally all Simple Buttons cause forms to close
2018-07-13 15:02:21 +00:00
def ChatBot ( ) :
2018-07-18 20:51:29 +00:00
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 ] ) ) )
2018-07-21 00:07:04 +00:00
button , value = form . Read ( )
2018-07-13 15:02:21 +00:00
# ---===--- Loop taking in user input and using it to query HowDoI web oracle --- #
while True :
if button == ' SEND ' :
2018-07-18 20:51:29 +00:00
print ( value )
2018-07-13 15:02:21 +00:00
else :
break
2018-07-21 00:07:04 +00:00
button , value = form . Read ( )
2018-07-18 20:51:29 +00:00
def NonBlockingPeriodicUpdateForm_ContextManager ( ) :
# Show a form that's a running counter
with SG . FlexForm ( ' Running Timer ' , auto_size_text = True ) as form :
2018-07-21 00:07:04 +00:00
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 ' ) ] ,
2018-07-18 20:51:29 +00:00
[ output_element ] ,
2018-07-21 00:07:04 +00:00
[ SG . T ( ' ' * 15 ) , SG . Quit ( ) ] ]
2018-07-18 20:51:29 +00:00
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 ) )
2018-07-21 00:07:04 +00:00
rc = form . Refresh ( )
2018-07-18 20:51:29 +00:00
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 } ' )
2018-07-21 00:07:04 +00:00
rc = form . Refresh ( )
if rc is None or rc [ 0 ] == ' Quit ' : # if user closed the window using X or clicked Quit button
2018-07-18 20:51:29 +00:00
break
time . sleep ( .01 )
else :
# if the loop finished then need to close the form for the user
form . CloseNonBlockingForm ( )
2018-07-21 00:07:04 +00:00
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 = ' - ' )
2018-07-18 20:51:29 +00:00
2018-07-21 00:07:04 +00:00
# SG.PrintClose()
2018-07-18 20:51:29 +00:00
2018-07-13 15:02:21 +00:00
def main ( ) :
2018-07-21 00:07:04 +00:00
SG . SetOptions ( border_width = 1 , element_padding = ( 4 , 6 ) , font = ( " Helvetica " , 10 ) , button_color = ( ' white ' , SG . BLUES [ 0 ] ) ,
progress_meter_border_depth = 0 )
2018-07-16 18:52:16 +00:00
SourceDestFolders ( )
2018-07-21 00:07:04 +00:00
Everything ( )
NonBlockingPeriodicUpdateForm_ContextManager ( )
2018-07-18 20:51:29 +00:00
ProgressMeter ( )
2018-07-16 18:52:16 +00:00
ChatBot ( )
2018-07-21 00:07:04 +00:00
DebugTest ( )
2018-07-13 15:02:21 +00:00
if __name__ == ' __main__ ' :
main ( )
2018-07-21 00:07:04 +00:00
exit ( 69 )