Merge pull request #120 from MikeTheWatchGuy/Dev-latest

Dev latest
This commit is contained in:
MikeTheWatchGuy 2018-09-04 20:43:22 -04:00 committed by GitHub
commit f6aaa9f6cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 377 additions and 144 deletions

View File

@ -2,11 +2,11 @@ import PySimpleGUI as sg
def Everything():
# sg.ChangeLookAndFeel('LightGreen')
# sg.SetOptions(input_elements_background_color=sg.COLOR_SYSTEM_DEFAULT)
sg.ChangeLookAndFeel('Dark')
form = sg.FlexForm('Everything bagel', default_element_size=(40, 1))
column1 = [[sg.Text('Column 1', background_color='#d3dfda', justification='center', size=(10, 1))],
column1 = [[sg.Text('Column 1', background_color='black', justification='center', size=(10, 1))],
[sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1')],
[sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2')],
[sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 3')]]
@ -15,17 +15,18 @@ def Everything():
[sg.Text('All graphic widgets in one form!', size=(30, 1), font=("Helvetica", 25))],
[sg.Text('Here is some text.... and a place to enter text')],
[sg.InputText('This is my text')],
[sg.Checkbox('My first checkbox!'), sg.Checkbox('My second checkbox!', default=True)],
[sg.Checkbox('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', size=(35, 3)),
sg.Multiline(default_text='A second multi-line', size=(35, 3))],
[sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 1)),
sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)],
[sg.InputOptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))],
[sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)),
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25),
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75),
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10),
sg.Column(column1, background_color='#d3dfda')],
sg.Column(column1, background_color='black')],
[sg.Text('_' * 80)],
[sg.Text('Choose A Folder', size=(35, 1))],
[sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'),
@ -35,7 +36,7 @@ def Everything():
button, values = form.LayoutAndRead(layout)
# sg.MsgBox('Title', 'The results of the form.', 'The button clicked was "{}"'.format(button), 'The values are', values)
sg.Popup('Title', 'The results of the form.', 'The button clicked was "{}"'.format(button), 'The values are', values)
Everything()
sg.SetOptions(button_color=sg.COLOR_SYSTEM_DEFAULT)
Everything()

View File

@ -1,9 +1,7 @@
import PySimpleGUI as gui
canvas = gui.Canvas(size=(100,100), background_color='red')
layout = [
[canvas],
[gui.Canvas(size=(100,100), background_color='red', key='canvas')],
[gui.T('Change circle color to:'), gui.ReadFormButton('Red'), gui.ReadFormButton('Blue')]
]
@ -11,12 +9,13 @@ form = gui.FlexForm('Canvas test')
form.Layout(layout)
form.ReadNonBlocking()
cir = canvas.TKCanvas.create_oval(50, 50, 100, 100)
cir = form.FindElement('canvas').TKCanvas.create_oval(50, 50, 100, 100)
while True:
button, values = form.Read()
if button is None: break
if button is None:
break
if button is 'Blue':
canvas.TKCanvas.itemconfig(cir, fill = "Blue")
form.FindElement('canvas').TKCanvas.itemconfig(cir, fill = "Blue")
elif button is 'Red':
canvas.TKCanvas.itemconfig(cir, fill = "Red")
form.FindElement('canvas').TKCanvas.itemconfig(cir, fill = "Red")

View File

@ -28,7 +28,7 @@ def ChatBotWithHistory():
]
form.Layout(layout)
# ---===--- Loop taking in user input and using it to query HowDoI --- #
# ---===--- Loop taking in user input and using it --- #
command_history = []
history_offset = 0
while True:

View File

@ -1684,21 +1684,7 @@ def main():
[g.Submit(), g.Quit(), g.SimpleButton('Show me lots of colors!', button_color=('white','#0e6251'))],
]
# [g.Multiline(DefaultText=str(printable), Size=(30,20))]]
(button, (hex_input, drop_down_value)) = g.FlexForm('Color Demo', auto_size_text=True, icon=MY_WINDOW_ICON).LayoutAndShow(layout)
drop_down_value = drop_down_value[0]
# ------- Form show ------- #
# layout = [[g.Text('Find color')],
# [g.Text('Demonstration of colors')],
# [g.Text('Enter a color name in text or hex #RRGGBB format')],
# [g.InputText()],
# [g.InputCombo(list_of_colors, size=(20,6)), g.T('Or choose from list')],
# [g.Submit(), g.Quit(), g.SimpleButton('Show me lots of colors!', button_color=('white','#0e6251'))],
# ]
# # [g.Multiline(DefaultText=str(printable), Size=(30,20))]]
# (button, (hex_input, drop_down_value)) = g.FlexForm('Color Demo', auto_size_text=True, icon=MY_WINDOW_ICON).LayoutAndShow(layout)
(button, (hex_input, drop_down_value)) = g.FlexForm('Color Demo', auto_size_text=True, icon=MY_WINDOW_ICON).LayoutAndRead(layout)
# ------- OUTPUT results portion ------- #
if button == '' or button == 'Quit' or button is None:
@ -1706,6 +1692,8 @@ def main():
elif button == 'Show me lots of colors!':
show_all_colors_on_buttons()
drop_down_value = drop_down_value[0]
if hex_input is not '' and hex_input[0] == '#':
color_hex = hex_input.upper()
color_name = get_name_from_hex(hex_input)
@ -1721,7 +1709,7 @@ def main():
[g.Button(button_text=color_name, button_color=(color_hex, complementary_hex))],
[g.Button(button_text=complementary_hex + ' ' + complementary_color, button_color=(complementary_hex , color_hex), size=(30,1))],
]
g.FlexForm('Color demo', default_element_size=(100,1), auto_size_text=True, auto_close=True, auto_close_duration=5, icon=MY_WINDOW_ICON).LayoutAndShow(layout)
g.FlexForm('Color demo', default_element_size=(100,1), auto_size_text=True, auto_close=True, auto_close_duration=5, icon=MY_WINDOW_ICON).LayoutAndRead(layout)

View File

@ -11,7 +11,6 @@ import PySimpleGUI as sg
def ScrollableColumns():
# sg.ChangeLookAndFeel('Dark')
column1 = [[sg.Text('Column 1', justification='center', size=(20, 1))],
[sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1', key='spin1', size=(30,1))],
[sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2', key='spin2')],
@ -33,12 +32,13 @@ def ScrollableColumns():
for i in range(50):
column2.append([sg.T(f'{i}{j}', size=(4, 1), background_color='gray25', text_color='white', pad=(1, 1)) for j in range(10)])
layout = [[sg.Column(column2, scrollable=True, size=(400,300)), sg.Column(column1, scrollable=True, size=(200,150))],
layout = [[sg.Column(column2, scrollable=True), sg.Column(column1, scrollable=True, size=(200,150))],
[sg.OK()]]
form = sg.FlexForm('Form Fill Demonstration', default_element_size=(40, 1))
b, v = form.LayoutAndRead(layout)
sg.Popup(v)
def NormalColumns():
# Column layout

View File

@ -1,13 +1,15 @@
import PySimpleGUI as sg
sg.SetOptions(button_color=sg.COLOR_SYSTEM_DEFAULT)
def GetFilesToCompare():
with sg.FlexForm('File Compare') as form:
form_rows = [[sg.Text('Enter 2 files to comare')],
[sg.Text('File 1', size=(15, 1)), sg.InputText(), sg.FileBrowse()],
[sg.Text('File 2', size=(15, 1)), sg.InputText(), sg.FileBrowse()],
[sg.Submit(), sg.Cancel()]]
rc = form.LayoutAndShow(form_rows)
return rc
button, values = form.LayoutAndRead(form_rows)
return button, values
def main():
button, (f1, f2) = GetFilesToCompare()

View File

@ -56,7 +56,7 @@ def FileBrowse():
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)
(button, (source_filename,)) = form.LayoutAndRead(form_rows)
print(button, source_filename)
@ -92,7 +92,7 @@ def Compare2Files():
[sg.Text('File 2', size=(8, 1)), sg.InputText(), sg.FileBrowse()],
[sg.Submit(), sg.Cancel()]]
button, values = form.LayoutAndShow(form_rows)
button, values = form.LayoutAndRead(form_rows)
print(button, values)
@ -364,15 +364,12 @@ def MediaPlayer():
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=(15, 2), 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=(17, 1), font=("Helvetica", 25))],
[TextElem],
[sg.Text('', size=(15, 2), font=("Helvetica", 14), key='out')],
[sg.ReadFormButton('Restart Song', button_color=(background, background),
image_filename=image_restart, image_size=(50, 50), image_subsample=2, border_width=0),
sg.Text(' ' * 2),
@ -387,8 +384,7 @@ def MediaPlayer():
border_width=0)],
[sg.Text('_' * 20)],
[sg.Text(' ' * 30)],
[
sg.Slider(range=(-10, 10), default_value=0, size=(10, 20), orientation='vertical',
[sg.Slider(range=(-10, 10), default_value=0, size=(10, 20), orientation='vertical',
font=("Helvetica", 15)),
sg.Text(' ' * 2),
sg.Slider(range=(-10, 10), default_value=0, size=(10, 20), orientation='vertical',
@ -398,9 +394,7 @@ def MediaPlayer():
font=("Helvetica", 15))],
[sg.Text('Bass', font=("Helvetica", 15), size=(6, 1)),
sg.Text('Treble', font=("Helvetica", 15), size=(10, 1)),
sg.Text('Volume', font=("Helvetica", 15), size=(7, 1))]
]
sg.Text('Volume', font=("Helvetica", 15), size=(7, 1))] ]
# Call the same LayoutAndRead but indicate the form is non-blocking
form.LayoutAndRead(layout, non_blocking=True)
@ -412,7 +406,7 @@ def MediaPlayer():
break
# If a button was pressed, display it on the GUI by updating the text element
if button:
TextElem.Update(button)
form.FindElement('out').Update(button)
def ScriptLauncher():
"""

View File

@ -1,20 +1,12 @@
import PySimpleGUI as sg
# THIS FILE REQIRES THE LATEST PySimpleGUI.py FILE
# IT WILL NOT WORK WITH CURRENT PIP RELEASE (2.7)
#
# If you want to use the return values as Dictionary feature, you need to download the PySimpleGUI.py file
# from GitHub and then place it in your project's folder. This SHOULD cause it to use this downloaded version
# instead of the pip installed one, if you've pip installed it. You can always uninstall the pip one :-)
# This design pattern shows how to use return values in dictionary form
# THIS FILE REQUIRES VERSION 2.8 OF PySimpleGUI!
form = sg.FlexForm('Simple data entry form') # begin with a blank form
layout = [
[sg.Text('Please enter your Name, Address, Phone')],
[sg.Text('Name', size=(15, 1)), sg.InputText('1')],
[sg.Text('Name', size=(15, 1)), sg.InputText('1', key='name')],
[sg.Text('Address', size=(15, 1)), sg.InputText('2', key='address')],
[sg.Text('Phone', size=(15, 1)), sg.InputText('3', key='phone')],
[sg.Submit(), sg.Cancel()]
@ -22,6 +14,5 @@ layout = [
button, values = form.LayoutAndRead(layout)
sg.MsgBox(button, values, values[0], values['address'], values['phone'])
sg.MsgBox(button, values, values['name'], values['address'], values['phone'])
print(values)

View File

@ -55,16 +55,16 @@ def HashManuallyBuiltGUI():
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)
(button, (source_filename, )) = form.LayoutAndRead(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')
SG.Popup( '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.PopupError('Display A Hash in PySimpleGUI', 'Illegal filename')
else:
SG.MsgBoxError('Display A Hash in PySimpleGUI', '* Cancelled *')
SG.PopupError('Display A Hash in PySimpleGUI', '* Cancelled *')
def HashManuallyBuiltGUINonContext():
# ------- Form design ------- #
@ -72,16 +72,16 @@ def HashManuallyBuiltGUINonContext():
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)
button, (source_filename, ) = form.LayoutAndRead(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')
SG.Popup( '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.PopupError('Display A Hash in PySimpleGUI', 'Illegal filename')
else:
SG.MsgBoxError('Display A Hash in PySimpleGUI', '* Cancelled *')
SG.PopupError('Display A Hash in PySimpleGUI', '* Cancelled *')
@ -100,15 +100,16 @@ def HashMostCompactGUI():
# ------- 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)
SG.Popup('Display Hash - Compact GUI', 'The SHA-1 Hash for the file\n', source_filename, hash)
else:
SG.MsgBox('Display Hash - Compact GUI', '* Cancelled *')
SG.Popup('Display Hash - Compact GUI', '* Cancelled *')
# ---------------------------------------------------------------------- #
# Our main calls two GUIs that act identically but use different calls #
# ---------------------------------------------------------------------- #
def main():
HashManuallyBuiltGUI()
HashManuallyBuiltGUINonContext()
HashMostCompactGUI()

24
Demo_ElementBrowser.py Normal file
View File

@ -0,0 +1,24 @@
import PySimpleGUI as sg
def ShowMainForm():
listbox_values = ('Text', 'InputText', 'Checkbox', 'Radio Button', 'Listbox', 'Slider' )
column2 = [ [sg.Output(size=(50, 20))],
[sg.ReadFormButton('Show Element'), sg.SimpleButton('Exit')]]
column1 = [[sg.Listbox(values=listbox_values, size=(20, len(listbox_values)), key='listbox')],
[sg.Text('', size=(10, 15))]]
layout = [[sg.Column(column1) , sg.Column(column2)]]
form = sg.FlexForm('Element Browser')
form.Layout(layout)
while True:
button, values = form.Read()
if button is None or button == 'Exit':
break
sg.MsgBox(button, values['listbox'][0])
ShowMainForm()

View File

@ -22,12 +22,12 @@ def HowDoI():
form = sg.FlexForm('How Do I ??', default_element_size=(30, 2), icon=DEFAULT_ICON, font=('Helvetica',' 13'), default_button_element_size=(8,2), return_keyboard_events=True)
multiline_elem = sg.Multiline(size=(85, 5), enter_submits=True, key='query', do_not_clear=False)
history_elem = sg.T('', size=(40,3))
history_elem = sg.T('', size=(40,3), text_color=sg.BLUES[0])
layout = [
[sg.Text('Ask and your answer will appear here....', size=(40, 1))],
[sg.Output(size=(127, 30), font=('Helvetica 10'))],
[ sg.Spin(values=(1, 2, 3, 4), initial_value=1, size=(2, 1), key='Num Answers', font='Helvetica 15'), sg.T('Num Answers',font='Helvetica 15'), sg.Checkbox('Display Full Text', key='full text', font='Helvetica 15')],
[sg.T('Command History'), history_elem],
[ sg.Spin(values=(1, 2, 3, 4), initial_value=1, size=(2, 1), key='Num Answers', font='Helvetica 15'), sg.T('Num Answers',font='Helvetica 15'), sg.Checkbox('Display Full Text', key='full text', font='Helvetica 15'),
sg.T('Command History'), history_elem],
[multiline_elem,
sg.ReadFormButton('SEND', button_color=(sg.YELLOWS[0], sg.BLUES[0]), bind_return_key=True),
sg.SimpleButton('EXIT', button_color=(sg.YELLOWS[0], sg.GREENS[0]))]
@ -40,6 +40,7 @@ def HowDoI():
(button, value) = form.Read()
if button is 'SEND':
query = value['query'].rstrip()
print(query)
QueryHowDoI(query, value['Num Answers'], value['full text']) # send the string to HowDoI
command_history.append(query)
history_offset = len(command_history)-1
@ -69,7 +70,7 @@ def QueryHowDoI(Query, num_answers, full_text):
'''
howdoi_command = HOW_DO_I_COMMAND
full_text_option = ' -a' if full_text else ''
t = subprocess.Popen(howdoi_command + ' '+ Query + ' -n ' + str(num_answers)+full_text_option, stdout=subprocess.PIPE)
t = subprocess.Popen(howdoi_command + ' \"'+ Query + '\" -n ' + str(num_answers)+full_text_option, stdout=subprocess.PIPE)
(output, err) = t.communicate()
print('{:^88}'.format(Query.rstrip()))
print('_'*60)

View File

@ -13,8 +13,9 @@ with sg.FlexForm("Realtime Keyboard Test", return_keyboard_events=True, use_defa
print(button, value, "exiting")
break
if button is not None:
print(button)
if len(button) == 1:
print('%s - %s'%(button, ord(button)))
else:
print(button)
elif value is None:
break

View File

@ -13,34 +13,33 @@ import PySimpleGUI as g
# create the 2 Elements we want to control outside the form
out_elem = g.Text('', size=(15, 1), font=('Helvetica', 18), text_color='red')
in_elem = g.Input(size=(10,1), do_not_clear=True, key='input')
in_elem = g.Input(size=(10, 1), do_not_clear=True, key='input')
layout = [[g.Text('Choose Test'), g.DropDown(values=['Input', 'Output', 'Some option']), g.ReadFormButton('Input Option', auto_size_button=True)],
layout = [[g.Text('Enter Your Passcode')],
[in_elem],
[g.ReadFormButton('1'), g.ReadFormButton('2'), g.ReadFormButton('3')],
[g.ReadFormButton('4'), g.ReadFormButton('5'), g.ReadFormButton('6')],
[g.ReadFormButton('7'), g.ReadFormButton('8'), g.ReadFormButton('9')],
[g.ReadFormButton('Submit'),g.ReadFormButton('0'), g.ReadFormButton('Clear')],
[g.ReadFormButton('Submit'), g.ReadFormButton('0'), g.ReadFormButton('Clear')],
[out_elem],
]
form = g.FlexForm('Keypad', default_element_size=(5,2), auto_size_buttons=False)
form = g.FlexForm('Keypad', default_button_element_size=(5, 2), auto_size_buttons=False)
form.Layout(layout)
# Loop forever reading the form's values, updating the Input field
keys_entered = ''
while True:
button, values = form.Read() # read the form
if button is None: # if the X button clicked, just exit
button, values = form.Read() # read the form
if button is None: # if the X button clicked, just exit
break
if button == 'Clear': # clear keys if clear button
if button is 'Clear': # clear keys if clear button
keys_entered = ''
elif button in '1234567890':
keys_entered = values['input'] # get what's been entered so far
keys_entered += button # add the new digit
elif button == 'Submit':
keys_entered = values['input'] # get what's been entered so far
keys_entered += button # add the new digit
elif button is 'Submit':
keys_entered = values['input']
out_elem.Update(keys_entered) # output the final string
in_elem.Update(keys_entered) # change the form to reflect current key string
out_elem.Update(keys_entered) # output the final string
in_elem.Update(keys_entered) # change the form to reflect current key string

View File

@ -26,7 +26,7 @@ def MachineLearningGUI():
del(form)
sg.SetOptions(text_justification='left')
return button, values
print(button, values)
def CustomMeter():
@ -37,7 +37,7 @@ def CustomMeter():
[progress_bar],
[sg.Cancel()]]
# create the form
# create the form`
form = sg.FlexForm('Custom Progress Meter')
# display the form as a non-blocking form
form.LayoutAndRead(layout, non_blocking=True)

View File

@ -0,0 +1,107 @@
import PySimpleGUI as g
import matplotlib.pyplot as plt
import ping
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, FigureCanvasAgg
import matplotlib.backends.tkagg as tkagg
import tkinter as tk
#================================================================================
# Globals
# These are needed because callback functions are used.
# Need to retain state across calls
#================================================================================
class MyGlobals:
axis_pings = None
ping_x_array = []
ping_y_array = []
g_my_globals = MyGlobals()
#================================================================================
# Performs *** PING! ***
#================================================================================
def run_a_ping_and_graph():
global g_my_globals # graphs are global so that can be retained across multiple calls to this callback
#===================== Do the ping =====================#
response = ping.quiet_ping('google.com',timeout=1000)
if response[0] == 0:
ping_time = 1000
else:
ping_time = response[0]
#===================== Store current ping in historical array =====================#
g_my_globals.ping_x_array.append(len(g_my_globals.ping_x_array))
g_my_globals.ping_y_array.append(ping_time)
# ===================== Only graph last 100 items =====================#
if len(g_my_globals.ping_x_array) > 100:
x_array = g_my_globals.ping_x_array[-100:]
y_array = g_my_globals.ping_y_array[-100:]
else:
x_array = g_my_globals.ping_x_array
y_array = g_my_globals.ping_y_array
# ===================== Call graphinc functions =====================#
g_my_globals.axis_ping.clear() # clear before graphing
g_my_globals.axis_ping.plot(x_array,y_array) # graph the ping values
#================================================================================
# Function: Set graph titles and Axis labels
# Sets the text for the subplots
# Have to do this in 2 places... initially when creating and when updating
# So, putting into a function so don't have to duplicate code
#================================================================================
def set_chart_labels():
global g_my_globals
g_my_globals.axis_ping.set_xlabel('Time')
g_my_globals.axis_ping.set_ylabel('Ping (ms)')
g_my_globals.axis_ping.set_title('Current Ping Duration', fontsize = 12)
def draw(fig, canvas):
# Magic code that draws the figure onto the Canvas Element's canvas
figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds
figure_w, figure_h = int(figure_w), int(figure_h)
photo = tk.PhotoImage(master=canvas, width=figure_w, height=figure_h)
canvas.create_image(640 / 2, 480 / 2, image=photo)
figure_canvas_agg = FigureCanvasAgg(fig)
figure_canvas_agg.draw()
tkagg.blit(photo, figure_canvas_agg.get_renderer()._renderer, colormode=2)
return photo
#================================================================================
# Function: MAIN
#================================================================================
def main():
global g_my_globals
canvas_elem = g.Canvas(size=(640, 480)) # get the canvas we'll be drawing on
# define the form layout
layout = [[g.Text('Animated Ping', size=(40,1), justification='center', font='Helvetica 20')],
[canvas_elem],
[g.ReadFormButton('Exit', size=(10,2), pad=((280, 0), 3), font='Helvetica 14')]]
# create the form and show it without the plot
form = g.FlexForm('Demo Application - Embedding Matplotlib In PySimpleGUI')
form.Layout(layout)
form.ReadNonBlocking()
canvas = canvas_elem.TKCanvas
fig = plt.figure()
g_my_globals.axis_ping = fig.add_subplot(1,1,1)
set_chart_labels()
plt.tight_layout()
while True:
button, values = form.ReadNonBlocking()
if button is 'Exit' or values is None:
break
run_a_ping_and_graph()
photo = draw(fig, canvas)
if __name__ == '__main__':
main()

View File

@ -36,16 +36,16 @@ def MediaPlayerGUI():
sg.Text(' ' * 2),
sg.Text(' ' * 2), sg.SimpleButton('Exit', button_color=(background,background),
image_filename=image_exit, image_size=(50, 50), image_subsample=2, border_width=0)],
[sg.Text('_'*30)],
[sg.Text('_'*20)],
[sg.Text(' '*30)],
[
sg.Slider(range=(-10, 10), default_value=0, size=(10, 20), orientation='vertical', font=("Helvetica", 15)),
sg.Text(' ' * 2),
sg.Slider(range=(-10, 10), default_value=0, size=(10, 20), orientation='vertical', font=("Helvetica", 15)),
sg.Text(' ' * 8),
sg.Text(' ' * 2),
sg.Slider(range=(-10, 10), default_value=0, size=(10, 20), orientation='vertical', font=("Helvetica", 15))],
[sg.Text('Bass', font=("Helvetica", 15), size=(6, 1)),
sg.Text('Treble', font=("Helvetica", 15), size=(10, 1)),
[sg.Text(' Bass', font=("Helvetica", 15), size=(9, 1)),
sg.Text('Treble', font=("Helvetica", 15), size=(7, 1)),
sg.Text('Volume', font=("Helvetica", 15), size=(7, 1))]
]

View File

@ -66,7 +66,7 @@ def RemoteControlExample():
# This is the code that reads and updates your window
button, values = form.ReadNonBlocking()
if button is not None:
sg.Print(button)
print(button)
if button == 'Quit' or values is None:
break
# time.sleep(.01)
@ -98,6 +98,7 @@ def StatusOutputExample_context_manager():
form.CloseNonBlockingForm()
def main():
StatusOutputExample()
RemoteControlExample()
StatusOutputExample()
sg.MsgBox('End of non-blocking demonstration')

59
Demo_Pi_LEDs.py Normal file
View File

@ -0,0 +1,59 @@
import PySimpleGUI as g
# GUI for switching an LED on and off to GPIO14
# GPIO and time library:
import RPi.GPIO as GPIO
import time
# determine that GPIO numbers are used:
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)
def SwitchLED():
varLEDStatus = GPIO.input(14)
if varLEDStatus == 0:
GPIO.output(14, GPIO.HIGH)
return "LED is switched ON"
else:
GPIO.output(14, GPIO.LOW)
return "LED is switched OFF"
def FlashLED():
for i in range(5):
GPIO.output(14, GPIO.HIGH)
time.sleep(0.5)
GPIO.output(14, GPIO.LOW)
time.sleep(0.5)
results_elem = g.T('', size=(30,1))
layout = [[g.T('Raspberry Pi LEDs')],
[results_elem],
[g.ReadFormButton('Switch LED')],
[g.ReadFormButton('Flash LED')],
[g.ReadFormButton('Show slider value')],
[g.Slider(range=(0, 100), default_value=0, orientation='h', size=(40,20), key='slider')],
[g.Exit()]
]
form = g.FlexForm('Raspberry Pi GUI')
form.Layout(layout)
while True:
button, values = form.Read()
if button is None:
break
if button is 'Switch LED':
results_elem.Update(SwitchLED())
elif button is 'Flash LED':
results_elem.Update('LED is Flashing')
form.ReadNonBlocking()
FlashLED()
results_elem.Update('')
elif button is 'Show slider value':
results_elem.Update('Slider = %s'%values['slider'])
g.MsgBox('Done... exiting')

View File

@ -18,9 +18,9 @@ def RemoteControlExample():
status_display_elem = sg.T('', justification='center', size=(19,1))
form_rows = [[sg.Text('Robotics Remote Control')],
[status_display_elem],
[sg.T(' '*10), sg.RealtimeButton('Forward', image_filename=image_forward)],
[sg.T(' '*6), sg.RealtimeButton('Forward', image_filename=image_forward)],
[ sg.RealtimeButton('Left', image_filename=image_left), sg.T(' '), sg.RealtimeButton('Right', image_filename=image_right)],
[sg.T(' '*10), sg.RealtimeButton('Reverse', image_filename=image_backward)],
[sg.T(' '*6), sg.RealtimeButton('Reverse', image_filename=image_backward)],
[sg.T('')],
[sg.Quit(button_color=('black', 'orange'))]
]
@ -51,11 +51,11 @@ def RemoteControlExample_NoGraphics():
# Make a form, but don't use context manager
form = sg.FlexForm('Robotics Remote Control', auto_size_text=True)
status_display_elem = sg.T('', justification='center', size=(19,1))
form_rows = [[sg.Text('Robotics Remote Control')],
form_rows = [[sg.Text('Robotics Remote Control', justification='center')],
[status_display_elem],
[sg.T(' '*10), sg.RealtimeButton('Forward')],
[ sg.RealtimeButton('Left'), sg.T(' '), sg.RealtimeButton('Right')],
[sg.T(' '*10), sg.RealtimeButton('Reverse')],
[sg.T(' '*8), sg.RealtimeButton('Forward')],
[ sg.RealtimeButton('Left'), sg.T(' '), sg.RealtimeButton('Right')],
[sg.T(' '*8), sg.RealtimeButton('Reverse')],
[sg.T('')],
[sg.Quit(button_color=('black', 'orange'))]
]

View File

@ -11,7 +11,7 @@ def SourceDestFolders():
[sg.Submit(), sg.Cancel()])
button, values = form.LayoutAndRead(form_rows)
if button == 'Submit':
if button is 'Submit':
sg.MsgBox('Submitted', values, 'The user entered source:', values['source'], 'Destination folder:', values['dest'], 'Using button', button)
else:
sg.MsgBoxError('Cancelled', 'User Cancelled')
@ -22,7 +22,7 @@ def MachineLearningGUI():
form = sg.FlexForm('Machine Learning Front End', font=("Helvetica", 12)) # begin with a blank form
layout = [[sg.Text('Machine Learning Command Line Parameters', font=('Helvetica', 16))],
[sg.Text('Passes', size=(15, 1)), sg.Spin(values=[i for i in range(1, 1000)], initial_value=20, size=(6, 1)),
[sg.Text('Passes', size =(15, 1)), sg.Spin(values=[i for i in range(1, 1000)], initial_value=20, size=(6, 1)),
sg.Text('Steps', size=(18, 1)), sg.Spin(values=[i for i in range(1, 1000)], initial_value=20, size=(6, 1))],
[sg.Text('ooa', size=(15, 1)), sg.In(default_text='6', size=(10, 1)), sg.Text('nn', size=(15, 1)), sg.In(default_text='10', size=(10, 1))],
[sg.Text('q', size=(15, 1)), sg.In(default_text='ff', size=(10, 1)), sg.Text('ngram', size=(15, 1)), sg.In(default_text='5', size=(10, 1))],
@ -71,7 +71,7 @@ def Everything():
sg.Spin(values=('Spin Box 1', '2','3'), initial_value='Spin Box 1')],
[sg.Text('_' * 80)],
[sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'), sg.InputText('Default Folder'), sg.FolderBrowse()],
[sg.Submit(), sg.Cancel(), sg.SimpleButton('Customized', button_color=('black', '#EDE5B7'))] ]
[sg.Submit(), sg.Cancel()] ]
button, values = form.LayoutAndRead(layout)
@ -81,7 +81,7 @@ def Everything():
# 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))
form = sg.FlexForm('Everything bagel', default_element_size=(40, 1))
layout = [
[sg.Text('All graphic widgets in one form!', size=(30, 1), font=("Helvetica", 25))],
[sg.Text('Here is some text.... and a place to enter text')],
@ -101,7 +101,7 @@ def Everything_NoContextManager():
[sg.Text('Choose A Folder', size=(35, 1))],
[sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'),
sg.InputText('Default Folder'), sg.FolderBrowse()],
[sg.Submit(), sg.Cancel(), sg.SimpleButton('Customized', button_color=('white', '#7E6C92'))]
[sg.Submit(), sg.Cancel()]
]
button, values = form.LayoutAndRead(layout)
@ -117,9 +117,9 @@ def ProgressMeter():
# 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))],
with sg.FlexForm('Chat Window', auto_size_text=True, default_element_size=(30, 2), default_button_element_size=(10,2)) as form:
layout = [[(sg.Text('This is where standard out is being routed', size=(40, 1)))],
[sg.Output(size=(80, 20), font=('Courier 10'))],
[sg.Multiline(size=(70, 5), enter_submits=True), sg.ReadFormButton('SEND', button_color=(sg.YELLOWS[0], sg.BLUES[0]), bind_return_key=True), 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
@ -127,10 +127,9 @@ def ChatBot():
# ---===--- 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:
if button is not 'SEND':
break
print(value[0])
# Shows a form that's a running counter
# this is the basic design pattern if you can keep your reading of the
@ -138,16 +137,16 @@ def ChatBot():
# 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')
text_element = sg.Text('', size=(15, 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()]]
[sg.T(' ' * 22), 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
if values is None or button is 'Quit': # if user closed the window using X
break
time.sleep(.01)
else:
@ -171,9 +170,9 @@ def NonBlockingPeriodicUpdateForm():
while True:
i += 1 * (timer_running is True)
button, values = form.ReadNonBlocking()
if values is None or button == 'Quit': # if user closed the window using X or clicked Quit button
if values is None or button is 'Quit': # if user closed the window using X or clicked Quit button
break
elif button == 'Start/Stop':
elif button is 'Start/Stop':
timer_running = not timer_running
text_element.Update('{:02d}:{:02d}.{:02d}'.format((i//100)//60, (i//100)%60, i%100))
@ -202,32 +201,35 @@ def ChangeLookAndFeel(colors):
scrollbar_color=(colors['INPUT']),
element_text_color=colors['TEXT'])
def OneLineGUI():
return sg.FlexForm('Get filename example').LayoutAndRead(
[[sg.Text('Filename')], [sg.Input(), sg.FileBrowse()], [sg.OK(), sg.Cancel()]])
#=---------------------------------- main ------------------------------
def main():
Everything()
# button, (filename,) = OneLineGUI()
# DebugTe`st()
ChatBot()
sg.ChangeLookAndFeel('BrownBlue')
Everything()
SourceDestFolders()
sg.ChangeLookAndFeel('BlueMono')
Everything()
sg.ChangeLookAndFeel('BluePurple')
Everything()
sg.ChangeLookAndFeel('LightGreen')
Everything()
sg.ChangeLookAndFeel('GreenMono')
MachineLearningGUI()
sg.ChangeLookAndFeel('TealMono')
NonBlockingPeriodicUpdateForm_ContextManager()
NonBlockingPeriodicUpdateForm()
ChatBot()
Everything()
sg.ChangeLookAndFeel('GreenTan')
Everything()
# ChatBot()
SourceDestFolders()
MachineLearningGUI()
NonBlockingPeriodicUpdateForm()
ProgressMeter()
DebugTest()
sg.ChangeLookAndFeel('Purple')
Everything_NoContextManager()
NonBlockingPeriodicUpdateForm_ContextManager()
sg.MsgBox('Done with all recipes')
DebugTest()
if __name__ == '__main__':
main()

View File

@ -14,7 +14,9 @@ def execute_command_blocking(command, *args):
print(out.decode("utf-8"))
if err:
print(err.decode("utf-8"))
except: pass
except:
out = ''
return out
# Executes command and immediately returns. Will not see anything the script outputs
def execute_command_nonblocking(command, *args):

View File

@ -21,5 +21,5 @@ else:
fname = sys.argv[1]
if not fname:
sg.MsgBox("Cancel", "No filename supplied")
sg.Popup("Cancel", "No filename supplied")
raise SystemExit("Cancelling: no filename supplied")

View File

@ -1,17 +1,31 @@
import PySimpleGUI as sg
# Very basic form. Return values as a dictionary
form = sg.FlexForm('Simple data entry form') # begin with a blank form
layout = [
[sg.Text('Please enter your Name, Address, Phone')],
[sg.Text('Name', size=(15, 1)), sg.InputText('name', key='name')],
[sg.Text('Address', size=(15, 1)), sg.InputText('address', key='address')],
[sg.Text('Phone', size=(15, 1)), sg.InputText('phone', key='phone')],
[sg.Ok(), sg.Cancel()]
]
button, values = form.LayoutAndRead(layout)
print(button, values['name'], values['address'], values['phone'])
form = sg.FlexForm('Simple data entry form') # begin with a blank form
layout = [
[sg.Text('Please enter your Name, Address, Phone')],
[sg.Text('Name', size=(15, 1)), sg.InputText('1', key='name')],
[sg.Text('Address', size=(15, 1)), sg.InputText('2', key='address')],
[sg.Text('Phone', size=(15, 1)), sg.InputText('3', key='phone')],
[sg.Submit(), sg.Cancel()]
[sg.Text('Name', size=(15, 1)), sg.InputText('name')],
[sg.Text('Address', size=(15, 1)), sg.InputText('address')],
[sg.Text('Phone', size=(15, 1)), sg.InputText('phone')],
[sg.Ok(), sg.Cancel()]
]
button, values = form.LayoutAndRead(layout)
sg.MsgBox(button, values['name'], values['address'], values['phone'])
print(values)
name, address, phone = values
sg.MsgBox(button, values[0], values[1], values[2])

View File

@ -35,7 +35,7 @@ def eBaySuperSearcherGUI():
# the form layout
with sg.FlexForm('EBay Super Searcher', auto_size_text=True) as form:
with sg.FlexForm('EBay Super Searcher') as form2:
with sg.FlexForm('EBay Super Searcher', auto_size_text=False) 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)],
@ -65,7 +65,6 @@ def eBaySuperSearcherGUI():
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))])
@ -82,6 +81,7 @@ def eBaySuperSearcherGUI():
if __name__ == '__main__':
# sg.SetOptions(background_color='white')
results = eBaySuperSearcherGUI()
print(results)
sg.MsgBox('Results', results)

47
Demo_Timer.py Normal file
View File

@ -0,0 +1,47 @@
import PySimpleGUI as sg
import time
# form that doen't block
# good for applications with an loop that polls hardware
def Timer():
sg.ChangeLookAndFeel('TealMono')
# 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
# Create the rows
form_rows = [[sg.Text('Stopwatch')],
[sg.Text('', size=(8, 2), font=('Helvetica', 20), justification='center', key='text')],
[sg.ReadFormButton('Pause/Resume'), sg.ReadFormButton('Reset')]]
# 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.
#
# your program's main loop
i = 0
paused = False
while (True):
# This is the code that reads and updates your window
form.FindElement('text').Update('{:02d}:{:02d}.{:02d}'.format((i // 100) // 60, (i // 100) % 60, i % 100))
button, values = form.ReadNonBlocking()
if values is None:
break
if button is 'Reset':
i=0
elif button is 'Pause/Resume':
paused = not paused
if not paused:
i += 1
# Your code begins here
time.sleep(.01)
# Broke out of main loop. Close the window.
form.CloseNonBlockingForm()
Timer()