From bce8382d6e43c0455578fe1a8bb7ef1fe3c3befc Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy Date: Wed, 25 Jul 2018 07:38:20 -0400 Subject: [PATCH] Remove renamed files --- Demo DisplayHash1and256.py | 123 -------------------------- Demo DuplicateFileFinder.py | 56 ------------ Demo GoodColors.py | 50 ----------- Demo HowDoI.py | 54 ------------ Demo Media Player.py | 60 ------------- Demo NonBlocking Form.py | 59 ------------- Demo Recipes.py | 167 ------------------------------------ Demo Tabbed Form.py | 89 ------------------- 8 files changed, 658 deletions(-) delete mode 100644 Demo DisplayHash1and256.py delete mode 100644 Demo DuplicateFileFinder.py delete mode 100644 Demo GoodColors.py delete mode 100644 Demo HowDoI.py delete mode 100644 Demo Media Player.py delete mode 100644 Demo NonBlocking Form.py delete mode 100644 Demo Recipes.py delete mode 100644 Demo Tabbed Form.py diff --git a/Demo DisplayHash1and256.py b/Demo DisplayHash1and256.py deleted file mode 100644 index dbc47afc..00000000 --- a/Demo DisplayHash1and256.py +++ /dev/null @@ -1,123 +0,0 @@ -#!Python 3 -import hashlib -import PySimpleGUI as SG - - ######################################################################### -# DisplayHash # -# A PySimpleGUI demo app that displays SHA1 hash for user browsed file # -# Useful and a recipe for GUI success # - ######################################################################### - -# ====____====____==== FUNCTION compute_hash_for_file(filename) ====____====____==== # -# Reads a file, computes the Hash # -# ---------------------------------------------------------------------------------- # -def compute_sha1_hash_for_file(filename): - try: - x = open(filename, "rb").read() - except: - return 0 - - m = hashlib.sha1() - m.update(x) - f_sha = m.hexdigest() - - return f_sha - - -# ====____====____==== FUNCTION compute_hash_for_file(filename) ====____====____==== # -# Reads a file, computes the Hash # -# ---------------------------------------------------------------------------------- # -def compute_sha256_hash_for_file(filename): - try: - f = open(filename, "rb") - x = f.read() - except: - return 0 - - m = hashlib.sha256() - m.update(x) - f_sha = m.hexdigest() - - return f_sha - - - # ====____====____==== Uses A GooeyGUI GUI ====____====____== # -# Get the filename, display the hash, dirt simple all around # - # ----------------------------------------------------------- # - -# ---------------------------------------------------------------------- # -# Compute and display SHA1 hash # -# Builds and displays the form using the most basic building blocks # -# ---------------------------------------------------------------------- # -def HashManuallyBuiltGUI(): - # ------- Form design ------- # - with SG.FlexForm('SHA-1 & 256 Hash', auto_size_text=True) as form: - form_rows = [[SG.Text('SHA-1 and SHA-256 Hashes for the file')], - [SG.InputText(), SG.FileBrowse()], - [SG.Submit(), SG.Cancel()]] - (button, (source_filename, )) = form.LayoutAndShow(form_rows) - - if button == 'Submit': - if source_filename != '': - hash_sha1 = compute_sha1_hash_for_file(source_filename).upper() - hash_sha256 = compute_sha256_hash_for_file(source_filename).upper() - SG.MsgBox( 'Display A Hash in PySimpleGUI', 'The SHA-1 Hash for the file\n', source_filename, hash_sha1, 'SHA-256 is', hash_sha256, line_width=75) - else: SG.MsgBoxError('Display A Hash in PySimpleGUI', 'Illegal filename') - else: - SG.MsgBoxError('Display A Hash in PySimpleGUI', '* Cancelled *') - -def HashManuallyBuiltGUINonContext(): - # ------- Form design ------- # - form = SG.FlexForm('SHA-1 & 256 Hash', auto_size_text=True) - form_rows = [[SG.Text('SHA-1 and SHA-256 Hashes for the file')], - [SG.InputText(), SG.FileBrowse()], - [SG.Submit(), SG.Cancel()]] - (button, (source_filename, )) = form.LayoutAndShow(form_rows) - - if button == 'Submit': - if source_filename != '': - hash_sha1 = compute_sha1_hash_for_file(source_filename).upper() - hash_sha256 = compute_sha256_hash_for_file(source_filename).upper() - SG.MsgBox( 'Display A Hash in PySimpleGUI', 'The SHA-1 Hash for the file\n', source_filename, hash_sha1, 'SHA-256 is', hash_sha256, line_width=75) - else: SG.MsgBoxError('Display A Hash in PySimpleGUI', 'Illegal filename') - else: - SG.MsgBoxError('Display A Hash in PySimpleGUI', '* Cancelled *') - - - - -# ---------------------------------------------------------------------- # -# Compute and display SHA1 hash # -# This one cheats and uses the higher-level Get A File pre-made func # -# Hey, it's a really common operation so why not? # -# ---------------------------------------------------------------------- # -def HashMostCompactGUI(): - # ------- INPUT GUI portion ------- # - - rc, source_filename = SG.GetFileBox('Display A Hash Using PySimpleGUI', - 'Display a Hash code for file of your choice') - - # ------- OUTPUT GUI results portion ------- # - if rc == True: - hash = compute_sha1_hash_for_file(source_filename) - SG.MsgBox('Display Hash - Compact GUI', 'The SHA-1 Hash for the file\n', source_filename, hash) - else: - SG.MsgBox('Display Hash - Compact GUI', '* Cancelled *') - - -# ---------------------------------------------------------------------- # -# Our main calls two GUIs that act identically but use different calls # -# ---------------------------------------------------------------------- # -def main(): - HashManuallyBuiltGUINonContext() - HashMostCompactGUI() - - -# ====____====____==== Pseudo-MAIN program ====____====____==== # -# This is our main-alike piece of code # -# + Starts up the GUI # -# + Gets values from GUI # -# + Runs DeDupe_folder based on GUI inputs # -# ------------------------------------------------------------- # -if __name__ == '__main__': - main() diff --git a/Demo DuplicateFileFinder.py b/Demo DuplicateFileFinder.py deleted file mode 100644 index 49b061bb..00000000 --- a/Demo DuplicateFileFinder.py +++ /dev/null @@ -1,56 +0,0 @@ -import hashlib -import os -import PySimpleGUI as gg - - -# ====____====____==== FUNCTION DeDuplicate_folder(path) ====____====____==== # -# Function to de-duplicate the folder passed in # -# --------------------------------------------------------------------------- # -def FindDuplicatesFilesInFolder(path): - shatab = [] - total = 0 - small_count, dup_count, error_count = 0,0,0 - pngdir = path - if not os.path.exists(path): - gg.MsgBox('Duplicate Finder', '** Folder doesn\'t exist***', path) - return - pngfiles = os.listdir(pngdir) - total_files = len(pngfiles) - for idx, f in enumerate(pngfiles): - if not gg.EasyProgressMeter('Counting Duplicates', idx+1, total_files, 'Counting Duplicate Files'): - break - total += 1 - fname = os.path.join(pngdir, f) - if os.path.isdir(fname): - continue - x = open(fname, "rb").read() - - m = hashlib.sha256() - m.update(x) - f_sha = m.digest() - if f_sha in shatab: - # uncomment next line to remove duplicate files - # os.remove(fname) - dup_count += 1 - continue - shatab.append(f_sha) - - msg = f'{total} Files processed\n'\ - f'{dup_count} Duplicates found\n' - gg.MsgBox('Duplicate Finder Ended', msg) - -# ====____====____==== Pseudo-MAIN program ====____====____==== # -# This is our main-alike piece of code # -# + Starts up the GUI # -# + Gets values from GUI # -# + Runs DeDupe_folder based on GUI inputs # -# ------------------------------------------------------------- # -if __name__ == '__main__': - - source_folder = None - rc, source_folder = gg.GetPathBox('Duplicate Finder - Count number of duplicate files', 'Enter path to folder you wish to find duplicates in') - if rc is True and source_folder is not None: - FindDuplicatesFilesInFolder(source_folder) - else: - gg.MsgBoxCancel('Cancelling', '*** Cancelling ***') - exit(0) diff --git a/Demo GoodColors.py b/Demo GoodColors.py deleted file mode 100644 index 7d0402f8..00000000 --- a/Demo GoodColors.py +++ /dev/null @@ -1,50 +0,0 @@ -import PySimpleGUI as gg -import time - -def main(): - # ------- Make a new FlexForm ------- # - form = gg.FlexForm('GoodColors', auto_size_text=True, default_element_size=(30,2)) - form.AddRow(gg.Text('Having trouble picking good colors? Try one of the colors defined by PySimpleGUI')) - form.AddRow(gg.Text('Here come the good colors as defined by PySimpleGUI')) - - #===== Show some nice BLUE colors with yellow text ===== ===== ===== ===== ===== ===== =====# - text_color = gg.YELLOWS[0] - buttons = (gg.SimpleButton(f'BLUES[{j}]\n{c}', button_color=(text_color, c), size=(10,2)) for j, c in enumerate(gg.BLUES)) - form.AddRow(gg.T('Button Colors Using PySimpleGUI.BLUES')) - form.AddRow(*buttons) - form.AddRow(gg.Text('_' * 100, size=(65, 1))) - - #===== Show some nice PURPLE colors with yellow text ===== ===== ===== ===== ===== ===== =====# - buttons = (gg.SimpleButton(f'PURPLES[{j}]\n{c}', button_color=(text_color, c), size=(10,2)) for j, c in enumerate(gg.PURPLES)) - form.AddRow(gg.T('Button Colors Using PySimpleGUI.PURPLES')) - form.AddRow(*buttons) - form.AddRow(gg.Text('_' * 100, size=(65, 1))) - - #===== Show some nice GREEN colors with yellow text ===== ===== ===== ===== ===== ===== =====# - buttons = (gg.SimpleButton(f'GREENS[{j}]\n{c}', button_color=(text_color, c), size=(10,2)) for j, c in enumerate(gg.GREENS)) - form.AddRow(gg.T('Button Colors Using PySimpleGUI.GREENS')) - form.AddRow(*buttons) - form.AddRow(gg.Text('_' * 100, size=(65, 1))) - - #===== Show some nice TAN colors with yellow text ===== ===== ===== ===== ===== ===== =====# - text_color = gg.GREENS[0] # let's use GREEN text on the tan - buttons = (gg.SimpleButton(f'TANS[{j}]\n{c}', button_color=(text_color, c), size=(10,2)) for j, c in enumerate(gg.TANS)) - form.AddRow(gg.T('Button Colors Using PySimpleGUI.TANS')) - form.AddRow(*buttons) - form.AddRow(gg.Text('_' * 100, size=(65, 1))) - - #===== Show some nice YELLOWS colors with black text ===== ===== ===== ===== ===== ===== =====# - text_color = 'black' # let's use black text on the tan - buttons = (gg.SimpleButton(f'YELLOWS[{j}]\n{c}', button_color=(text_color, c), size=(10,2)) for j, c in enumerate(gg.YELLOWS)) - form.AddRow(gg.T('Button Colors Using PySimpleGUI.YELLOWS')) - form.AddRow(*buttons) - form.AddRow(gg.Text('_' * 100, size=(65, 1))) - - - #===== Add a click me button for fun and SHOW the form ===== ===== ===== ===== ===== ===== =====# - form.AddRow(gg.SimpleButton('Click ME!')) - (button, value) = form.Show() # show it! - - -if __name__ == '__main__': - main() diff --git a/Demo HowDoI.py b/Demo HowDoI.py deleted file mode 100644 index 26858ed3..00000000 --- a/Demo HowDoI.py +++ /dev/null @@ -1,54 +0,0 @@ -import PySimpleGUI as SG -import subprocess -import howdoi - -# Test this command in a dos window if you are having trouble. -HOW_DO_I_COMMAND = 'python -m howdoi.howdoi' - -# if you want an icon on your taskbar for this gui, then change this line of code to point to the ICO file -DEFAULT_ICON = 'E:\\TheRealMyDocs\\Icons\\QuestionMark.ico' - -def HowDoI(): - ''' - Make and show a window (PySimpleGUI form) that takes user input and sends to the HowDoI web oracle - Excellent example of 2 GUI concepts - 1. Output Element that will show text in a scrolled window - 2. Non-Window-Closing Buttons - These buttons will cause the form to return with the form's values, but doesn't close the form - :return: never returns - ''' - # ------- Make a new FlexForm ------- # - form = SG.FlexForm('How Do I ??', auto_size_text=True, default_element_size=(30, 2), icon=DEFAULT_ICON) - form.AddRow(SG.Text('Ask and your answer will appear here....', size=(40, 1))) - form.AddRow(SG.Output(size=(90, 20))) - form.AddRow(SG.Multiline(size=(85, 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]))) - - # ---===--- Loop taking in user input and using it to query HowDoI --- # - while True: - (button, value) = form.Read() - if button == 'SEND': - QueryHowDoI(value[0][:-1]) # send string without carriage return on end - else: - break # exit button clicked - - exit(69) - -def QueryHowDoI(Query): - ''' - Kicks off a subprocess to send the 'Query' to HowDoI - Prints the result, which in this program will route to a gooeyGUI window - :param Query: text english question to ask the HowDoI web engine - :return: nothing - ''' - howdoi_command = HOW_DO_I_COMMAND - t = subprocess.Popen(howdoi_command + ' '+ Query, stdout=subprocess.PIPE) - (output, err) = t.communicate() - print('You asked: '+ Query) - print('_______________________________________') - print(output.decode("utf-8") ) - exit_code = t.wait() - -if __name__ == '__main__': - HowDoI() - diff --git a/Demo Media Player.py b/Demo Media Player.py deleted file mode 100644 index 4770c90e..00000000 --- a/Demo Media Player.py +++ /dev/null @@ -1,60 +0,0 @@ -import PySimpleGUI as sg - -# -# An Async Demonstration of a media player -# Uses button images for a super snazzy look -# See how it looks here: -# https://user-images.githubusercontent.com/13696193/43159403-45c9726e-8f50-11e8-9da0-0d272e20c579.jpg -# - - -def MediaPlayerGUI(): - - # Images are located in a subfolder in the Demo Media Player.py folder - image_pause = './ButtonGraphics/Pause.png' - image_restart = './ButtonGraphics/Restart.png' - image_next = './ButtonGraphics/Next.png' - image_exit = './ButtonGraphics/Exit.png' - - # A text element that will be changed to display messages in the GUI - TextElem = sg.Text('', size=(20, 3), font=("Helvetica", 14)) - - # Open a form, note that context manager can't be used generally speaking for async forms - form = sg.FlexForm('Media File Player', auto_size_text=True, default_element_size=(20, 1), - font=("Helvetica", 25)) - # define layout of the rows - layout= [[sg.Text('Media File Player', size=(20, 1), font=("Helvetica", 25))], - [TextElem], - [sg.ReadFormButton('Restart Song', button_color=sg.TRANSPARENT_BUTTON, - image_filename=image_restart, image_size=(50, 50), image_subsample=2, border_width=0, - size=(10, 2), font=("Helvetica", 15)), sg.Text(' ' * 2), - sg.ReadFormButton('Pause', button_color=sg.TRANSPARENT_BUTTON, - image_filename=image_pause, image_size=(50, 50), image_subsample=2, border_width=0, - font=("Helvetica", 15), size=(10, 2)), sg.Text(' ' * 2), - sg.ReadFormButton('Next', button_color=sg.TRANSPARENT_BUTTON, - image_filename=image_next, image_size=(50, 50), image_subsample=2, border_width=0, - size=(10, 2), font=("Helvetica", 15)), sg.Text(' ' * 2), - sg.Text(' ' * 2), sg.SimpleButton('Exit', button_color=sg.TRANSPARENT_BUTTON, - image_filename=image_exit, image_size=(50, 50), image_subsample=2, border_width=0, - size=(10, 2), font=("Helvetica", 15))], - [sg.Text('Treble', font=("Helvetica", 15), size=(6, 1)), - sg.Slider(range=(-10, 10), default_value=0, size=(10, 20), orientation='vertical', font=("Helvetica", 15)), - sg.Text(' ' * 5), - sg.Text('Volume', font=("Helvetica", 15), size=(7, 1)), - sg.Slider(range=(-10, 10), default_value=0, size=(10, 20), orientation='vertical', font=("Helvetica", 15))], - ] - - # Call the same LayoutAndRead but indicate the form is non-blocking - form.LayoutAndRead(layout, non_blocking=True) - # Our event loop - while(True): - # Read the form (this call will not block) - button, values = form.ReadNonBlocking() - if button == 'Exit': - break - # If a button was pressed, display it on the GUI by updating the text element - if button: - TextElem.Update(button) - -MediaPlayerGUI() - diff --git a/Demo NonBlocking Form.py b/Demo NonBlocking Form.py deleted file mode 100644 index 8e43d6dd..00000000 --- a/Demo NonBlocking Form.py +++ /dev/null @@ -1,59 +0,0 @@ -import PySimpleGUI as sg -import time - -def main(): - StatusOutputExample() - -# form that doen't block -def StatusOutputExample_context_manager(): - 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.LayoutAndRead(form_rows, non_blocking=True) - - for i in range(1, 1000): - output_element.Update('{:02d}:{:02d}.{:02d}'.format(*divmod(int(i/100), 60), i%100)) - button, values = form.ReadNonBlocking() - if values is None or button == 'Quit': - break - time.sleep(.01) - else: - form.CloseNonBlockingForm() - - -# form that doen't block -def StatusOutputExample(): - # Make a form, but don't use context manager - form = sg.FlexForm('Running Timer', auto_size_text=True) - # Create a text element that will be updated with status information on the GUI itself - output_element = sg.Text('', size=(8, 2), font=('Helvetica', 20)) - # Create the rows - form_rows = [[sg.Text('Non-blocking GUI with updates')], - [output_element], - [sg.SimpleButton('Quit')]] - # Layout the rows of the form and perform a read. Indicate the form is non-blocking! - form.LayoutAndRead(form_rows, non_blocking=True) - - # - # Some place later in your code... - # You need to perform a ReadNonBlocking on your form every now and then or - # else it won't refresh - # - - for i in range(1, 1000): - output_element.Update('{:02d}:{:02d}.{:02d}'.format(*divmod(int(i / 100), 60), i % 100)) - button, values = form.ReadNonBlocking() - if values is None or button == 'Quit': - break - time.sleep(.01) - else: - form.CloseNonBlockingForm() - - - -if __name__ == '__main__': - - main() diff --git a/Demo Recipes.py b/Demo Recipes.py deleted file mode 100644 index 6f2a76cd..00000000 --- a/Demo Recipes.py +++ /dev/null @@ -1,167 +0,0 @@ -import time -from random import randint -import PySimpleGUI as sg - -# A simple blocking form. Your best starter-form -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.LayoutAndRead(form_rows) - if button == 'Submit': - sg.MsgBox('Submitted', 'The user entered source:', source, 'Destination folder:', dest, 'Using button', button) - else: - sg.MsgBoxError('Cancelled', 'User Cancelled') - -# YOUR BEST STARTING POINT -# This is a form showing you all of the basic Elements (widgets) -# Some have a few of the optional parameters set, but there are more to choose from -# You want to use the context manager because it will free up resources when you are finished -# Use this especially if you are runningm multi-threaded -# Where you free up resources is really important to tkinter -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.Multiline(default_text='This is the default Text shoulsd you decide not to type anything', - scale=(2, 10))], - [sg.InputCombo(['Combobox 1', 'Combobox 2'], size=(20, 3)), - sg.Slider(range=(1, 100), orientation='h', size=(35, 20), default_value=85)], - [sg.Listbox(values=['Listbox 1', 'Listbox 2', 'Listbox 3'], size=(30, 6)), - sg.Slider(range=(1, 100), orientation='v', size=(10, 20), default_value=25), - sg.Slider(range=(1, 100), orientation='v', size=(10, 20), default_value=75), - sg.Slider(range=(1, 100), orientation='v', size=(10, 20), default_value=10)], - [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, justification='right'), sg.InputText('Source'), sg.FolderBrowse()], - [sg.Text('Destination Folder', size=(15, 1), auto_size_text=False, justification='right'), sg.InputText('Dest'), - sg.FolderBrowse()], - [sg.Submit(), sg.Cancel(), sg.SimpleButton('Customized', button_color=('white', 'green'))] - ] - - button, values = form.LayoutAndRead(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) - -# Should you decide not to use a context manager, then try this form as your starting point -# Be aware that tkinter, which this is based on, is picky about who frees up resources, especially if -# you are running multithreaded -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 shoulsd you decide not to type anything', scale=(2, 10))], - [sg.InputCombo(['Combobox 1', 'Combobox 2'], size=(20, 3)), sg.Slider(range=(1, 100), orientation='h', size=(35, 20), default_value=85)], - [sg.Listbox(values=['Listbox 1', 'Listbox 2', 'Listbox 3'], size=(30, 6)), - sg.Slider(range=(1, 100), orientation='v', size=(10, 20), default_value=25), - sg.Slider(range=(1, 100), orientation='v', size=(10, 20), default_value=75), - sg.Slider(range=(1, 100), orientation='v', size=(10, 20), default_value=10)], - [sg.Text('_' * 100, size=(70, 1))], - [sg.Text('Choose Source and Destination Folders', size=(35, 1), text_color='red')], - [sg.Text('Source Folder', size=(15, 1), auto_size_text=False, justification='right'), sg.InputText('Source'), sg.FolderBrowse()], - [sg.Text('Destination Folder', size=(15, 1), auto_size_text=False, justification='right'), sg.InputText('Dest'), sg.FolderBrowse()], - [sg.Submit(), sg.Cancel(), sg.SimpleButton('Customized', button_color=('white', 'green'))]] - - button, values = form.LayoutAndRead(layout) - del(form) - - 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 ProgressMeter(): - for i in range(1,10000): - if not sg.EasyProgressMeter('My Meter', i + 1, 10000): break - # SG.Print(i) - -# Blocking form that doesn't close -def ChatBot(): - with sg.FlexForm('Chat Window', auto_size_text=True, default_element_size=(30, 2)) as form: - layout = [[(sg.Text('This is where standard out is being routed', size=[40, 1]))], - [sg.Output(size=(80, 20))], - [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]))]] - # notice this is NOT the usual LayoutAndRead call because you don't yet want to read the form - # if you call LayoutAndRead from here, then you will miss the first button click - form.Layout(layout) - # ---===--- Loop taking in user input and using it to query HowDoI web oracle --- # - while True: - button, value = form.Read() - if button == 'SEND': - print(value) - else: - break - -# Shows a form that's a running counter -# this is the basic design pattern if you can keep your reading of the -# form within the 'with' block. If your read occurs far away in your code from the form creation -# then you will want to use the NonBlockingPeriodicUpdateForm example -def NonBlockingPeriodicUpdateForm_ContextManager(): - with sg.FlexForm('Running Timer', auto_size_text=True) as form: - text_element = sg.Text('', size=(10, 2), font=('Helvetica', 20), text_color='red', justification='center') - layout = [[sg.Text('Non blocking GUI with updates', justification='center')], - [text_element], - [sg.T(' ' * 15), sg.Quit()]] - form.LayoutAndRead(layout, non_blocking=True) - - for i in range(1,500): - text_element.Update('{:02d}:{:02d}.{:02d}'.format((i // 100) // 60, (i // 100) % 60, i % 100)) - button, values = form.ReadNonBlocking() - if values is None or button == 'Quit': # if user closed the window using X - break - time.sleep(.01) - else: - # if the loop finished then need to close the form for the user - form.CloseNonBlockingForm() - -# Use this context-manager-free version if your read of the form occurs far away in your code -# from the form creation (call to LayoutAndRead) -def NonBlockingPeriodicUpdateForm(): - # Show a form that's a running counter - form = sg.FlexForm('Running Timer', auto_size_text=True) - text_element = sg.Text('', size=(10, 2), font=('Helvetica', 20), justification='center') - form_rows = [[sg.Text('Non blocking GUI with updates')], - [text_element], - [sg.T(' ' * 15), sg.Quit()]] - form.LayoutAndRead(form_rows, non_blocking=True) - - for i in range(1,50000): - text_element.Update('{:02d}:{:02d}.{:02d}'.format((i//100)//60, (i//100)%60, i%100)) - button, values = form.ReadNonBlocking() - if values is None or button == '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() - del(form) - -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='-') - - -def main(): - # SG.SetOptions(border_width=1, font=("Helvetica", 10), button_color=('white', SG.BLUES[0]), slider_border_width=1) - NonBlockingPeriodicUpdateForm_ContextManager() - NonBlockingPeriodicUpdateForm() - Everything_NoContextManager() - Everything() - ChatBot() - ProgressMeter() - SourceDestFolders() - ChatBot() - DebugTest() - sg.MsgBox('Done with all recipes') - -if __name__ == '__main__': - main() - exit(69) diff --git a/Demo Tabbed Form.py b/Demo Tabbed Form.py deleted file mode 100644 index 305202eb..00000000 --- a/Demo Tabbed Form.py +++ /dev/null @@ -1,89 +0,0 @@ -import PySimpleGUI as sg - -MAX_NUMBER_OF_THREADS = 12 - -def eBaySuperSearcherGUI(): - # Drop Down list of options - configs = ('0 - Gruen - Started 2 days ago in Watches', - '1 - Gruen - Currently Active in Watches', - '2 - Alpina - Currently Active in Jewelry', - '3 - Gruen - Ends in 1 day in Watches', - '4 - Gruen - Completed in Watches', - '5 - Gruen - Advertising', - '6 - Gruen - Currently Active in Jewelry', - '7 - Gruen - Price Test', - '8 - Gruen - No brand name specified') - - us_categories = ('Use Default with no change', - 'All - 1', - 'Jewelry - 281', - ' Watches - 14324', - ' Wristwatches - 31387', - ' Pocket Watches - 3937', - 'Advertising - 34', - ' Watch Ads - 165254' - ) - - german_categories =('Use Default with no change', - 'All - 1', - 'Jewelry - 281', - ' Watches - 14324', - ' Wristwatches - 31387', - ' Pocket Watches - 3937', - 'Advertising - 1', - ' Watch Ads - 19823' - ) - - - # the form layout - with sg.FlexForm('EBay Super Searcher', auto_size_text=True) as form: - with sg.FlexForm('EBay Super Searcher') as form2: - layout_tab_1 = [[sg.Text('eBay Super Searcher!', size=(60,1), font=('helvetica', 15))], - [sg.Text('Choose base configuration to run')], - [sg.InputCombo(configs)], - [sg.Text('_'*100, size=(80,1))], - [sg.InputText(),sg.Text('Choose Destination Folder'), sg.FolderBrowse(target=(sg.ThisRow,0))], - [sg.InputText(),sg.Text('Custom text to add to folder name')], - [sg.Text('_'*100, size=(80,1))], - [sg.Checkbox('US', default=True, size=(15, 1)), sg.Checkbox('German', size=(15, 1), default=True, )], - [sg.Radio('Active Listings','ActiveComplete', default = True,size=(15, 1)), sg.Radio('Completed Listings', 'ActiveComplete', size=(15, 1))], - [sg.Text('_'*100, size=(80,1))], - [sg.Checkbox('Save Images', size=(15,1)),sg.Checkbox('Save PDFs', size=(15,1)), sg.Checkbox('Extract PDFs', size=(15,1))], - [sg.Text('_'*100, size=(80,1))], - [sg.Text('Time Filters')], - [sg.Radio('No change','time', default=True),sg.Radio('ALL listings','time'),sg.Radio('Started 1 day ago','time', size=(15,1)),sg.Radio('Started 2 days ago','time', size=(15,1)), sg.Radio('Ends in 1 day','time', size=(15,1))], - [sg.Text('_'*100, size=(80,1))], - [sg.Text('Price Range'), sg.InputText(size=(10,1)),sg.Text('To'), sg.InputText(size=(10,1))], - [sg.Text('_'*100, size=(80,1))], - [sg.Submit(button_color=('red', 'yellow')), sg.Cancel(button_color=('white', 'blue')), sg.Text(f'{MAX_NUMBER_OF_THREADS} Threads will be started')]] - - - # First category is default (need to special case this) - layout_tab_2 = [[sg.Text('Choose Category')], - [sg.Text('US Categories'),sg.Text('German Categories')], - [sg.Radio(us_categories[0],'CATUS', default=True), sg.Radio(german_categories[0], 'CATDE', default=True)]] - - for i,cat in enumerate(us_categories): - if i == 0: continue # skip first one - layout_tab_2.append([sg.Radio(cat,'CATUS'), sg.Radio(german_categories[i],'CATDE')]) - - - layout_tab_2.append([sg.Text('_' * 100, size=(75, 1))]) - layout_tab_2.append([sg.Text('US Search String Override')]) - layout_tab_2.append([sg.InputText(size=(100,1))]) - layout_tab_2.append([sg.Text('German Search String Override')]) - layout_tab_2.append([sg.InputText(size=(100,1))]) - layout_tab_2.append([sg.Text('Typical US Search String')]) - layout_tab_2.append([sg.InputText(size=(100,1), default_text='gruen -sara -quarz -quartz -embassy -bob -robert -elephants -adidas -LED ')]) - layout_tab_2.append([sg.Text('_' * 100, size=(75, 1))]) - layout_tab_2.append([sg.Submit(button_color=('red', 'yellow'),auto_size_text=True), sg.Cancel(button_color=('white', 'blue'), auto_size_text=True)]) - - results =sg.ShowTabbedForm('eBay Super Searcher', (form,layout_tab_1,'Where To Save'), (form2, layout_tab_2, 'Categories & Search String')) - - return results - - -if __name__ == '__main__': - results = eBaySuperSearcherGUI() - print(results) - sg.MsgBox('Results', results) \ No newline at end of file