Demo updates with new theme calls

This commit is contained in:
PySimpleGUI 2019-12-24 18:52:47 -05:00
parent 52700b0780
commit 5484b047c0
96 changed files with 3530 additions and 228 deletions

View File

@ -5,15 +5,16 @@ Example of (almost) all widgets, that you can use in PySimpleGUI.
import PySimpleGUI as sg import PySimpleGUI as sg
sg.change_look_and_feel('GreenTan') # sg.theme('Dark Red')
# sg.theme('Default1')
# sg.set_options(text_color='black', background_color='#A6B2BE', text_element_background_color='#A6B2BE')
# ------ Menu Definition ------ # # ------ Menu Definition ------ #
menu_def = [['&File', ['&Open', '&Save', 'E&xit', 'Properties']], menu_def = [['&File', ['&Open', '&Save', 'E&xit', 'Properties']],
['&Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ], ['&Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ],
['&Help', '&About...'], ] ['&Help', '&About...'], ]
# ------ Column Definition ------ # # ------ Column Definition ------ #
column1 = [[sg.Text('Column 1', background_color='lightblue', justification='center', size=(10, 1))], column1 = [[sg.Text('Column 1', justification='center', size=(10, 1))],
[sg.Spin(values=('Spin Box 1', '2', '3'), [sg.Spin(values=('Spin Box 1', '2', '3'),
initial_value='Spin Box 1')], initial_value='Spin Box 1')],
[sg.Spin(values=('Spin Box 1', '2', '3'), [sg.Spin(values=('Spin Box 1', '2', '3'),
@ -30,13 +31,10 @@ layout = [
[sg.CBox('Checkbox', size=(10, 1)), [sg.CBox('Checkbox', size=(10, 1)),
sg.CBox('My second checkbox!', default=True)], sg.CBox('My second checkbox!', default=True)],
[sg.Radio('My first Radio! ', "RADIO1", default=True, size=(10, 1)), [sg.Radio('My first Radio! ', "RADIO1", default=True, size=(10, 1)),
sg.Radio('My second Radio!', "RADIO1")]], title='Options', sg.Radio('My second Radio!', "RADIO1")]], title='Options', relief=sg.RELIEF_SUNKEN, tooltip='Use these to set flags')],
title_color='red',
relief=sg.RELIEF_SUNKEN,
tooltip='Use these to set flags')],
[sg.MLine(default_text='This is the default Text should you decide not to type anything', size=(35, 3)), [sg.MLine(default_text='This is the default Text should you decide not to type anything', size=(35, 3)),
sg.MLine(default_text='A second multi-line', size=(35, 3))], sg.MLine(default_text='A second multi-line', size=(35, 3))],
[sg.Combo(('Combobox 1', 'Combobox 2'), size=(20, 1)), [sg.Combo(('Combobox 1', 'Combobox 2'),default_value='Combobox 1', size=(20, 1)),
sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)], sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)],
[sg.OptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))], [sg.OptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))],
[sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)), [sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)),
@ -44,7 +42,7 @@ layout = [
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25, tick_interval=25), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25, tick_interval=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=75),
sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10),
sg.Col(column1, background_color='lightblue')]]) sg.Col(column1)]])
], ],
[sg.Text('_' * 80)], [sg.Text('_' * 80)],
[sg.Text('Choose A Folder', size=(35, 1))], [sg.Text('Choose A Folder', size=(35, 1))],
@ -52,7 +50,7 @@ layout = [
sg.InputText('Default Folder'), sg.FolderBrowse()], sg.InputText('Default Folder'), sg.FolderBrowse()],
[sg.Submit(tooltip='Click to submit this form'), sg.Cancel()]] [sg.Submit(tooltip='Click to submit this form'), sg.Cancel()]]
window = sg.Window('Everything bagel', layout, window = sg.Window('Everything bagel', layout, no_titlebar=True,
default_element_size=(40, 1), grab_anywhere=False) default_element_size=(40, 1), grab_anywhere=False)
event, values = window.read() event, values = window.read()

View File

@ -25,7 +25,7 @@ EDGE_OFFSET = 3
GRAPH_SIZE = (500,500) GRAPH_SIZE = (500,500)
DATA_SIZE = (500,500) DATA_SIZE = (500,500)
sg.change_look_and_feel('Light Brown 1') sg.theme('Light Brown 1')
graph = sg.Graph(GRAPH_SIZE, (0,0), DATA_SIZE) graph = sg.Graph(GRAPH_SIZE, (0,0), DATA_SIZE)

View File

@ -3,7 +3,7 @@ import PySimpleGUI as sg
# Turn off padding in order to get a really tight looking layout. # Turn off padding in order to get a really tight looking layout.
sg.change_look_and_feel('Dark') sg.theme('Dark')
sg.set_options(element_padding=(0, 0)) sg.set_options(element_padding=(0, 0))
layout = [[sg.Text('User:', pad=((3, 0), 0)), sg.OptionMenu(values=('User 1', 'User 2'), size=(20, 1)), layout = [[sg.Text('User:', pad=((3, 0), 0)), sg.OptionMenu(values=('User 1', 'User 2'), size=(20, 1)),

View File

@ -1,30 +1,31 @@
#!/usr/bin/env python
import winsound
import sys
import PySimpleGUI as sg import PySimpleGUI as sg
from random import randint
if not sys.platform.startswith('win'): sg.theme('Dark Blue 3')
sg.popup_error('Sorry, you gotta be on Windows')
sys.exit(0)
# .WAV files that contain your click sounds. Put full path if not in your application's folder layout = [ [sg.Text('Temperature'), sg.T(' '*30), sg.Text(size=(8,1), key='-TEMP OUT-')],
click_sound = r'ButtonClick.wav' [sg.Text('Set Temp'), sg.T(' '*8), sg.Input(size=(8,1), key='-IN-'), sg.T(' '*10), sg.Button('Set')],
click_sound1 = r'ButtonClick1.wav' [sg.Button('Off'), sg.T(' '*13), sg.Button('Turn relay on', button_color=('white', 'red')),sg.T(' '*5), sg.Button('Quit')] ]
sg.change_look_and_feel('Dark Blue 3') # because gray windows are boring window = sg.Window('Temperature Manager', layout, font='Default -24', return_keyboard_events=True, no_titlebar=True)
# Your window's layout while True: # Event Loop
layout = [ [sg.Text('Click a button to hear a click')], event, values = window.read(timeout=500) # returns every 500 ms
[sg.Button('Click'), sg.Button('Another Click')]] print(event, values) if event != sg.TIMEOUT_KEY else None # a debug print
# Create your Window if event in (None, 'Quit'):
window = sg.Window("Button Click", layout)
while True: # The Event Loops
event, values = window.read()
if event is None:
break break
if event == 'Click': if event == 'Set':
winsound.PlaySound(click_sound, 1) print('setting temperature to ', values['-IN-'])
elif event == 'Another Click': window['-TEMP OUT-'].update(values['-IN-'] + ' C')
winsound.PlaySound(click_sound1, 1) elif event.startswith('Turn'):
print('Turning on the relay')
elif event == 'Off':
print('Turning off sensor')
elif event.startswith('F11'):
window.maximize()
elif event.startswith('Escape'):
window.normal()
window['-TEMP OUT-'].update(str(randint(2,70)) + ' C')
window.close() window.close()

View File

@ -7,7 +7,7 @@ Shows how button states can be controlled by a user application. The program ma
states for buttons and changes the text color to show greyed-out (disabled) buttons states for buttons and changes the text color to show greyed-out (disabled) buttons
""" """
sg.change_look_and_feel('Dark') sg.theme('Dark')
sg.set_options(element_padding=(0, 0)) sg.set_options(element_padding=(0, 0))
layout = [[sg.Text('User:', pad=((3, 0), 0)), sg.OptionMenu(values=('User 1', 'User 2'), size=(20, 1)), sg.Text('0', size=(8, 1))], layout = [[sg.Text('User:', pad=((3, 0), 0)), sg.OptionMenu(values=('User 1', 'User 2'), size=(20, 1)), sg.Text('0', size=(8, 1))],

View File

@ -7,7 +7,7 @@ play = b'iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAA
stop = b'iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAAAaklEQVRoge3ZQQqAMAxFwSre/8p6AZFUiXzKzLqLPNJVOwYAvLcVzpztU9Q8zrr/NUW3Y+JsZXsdSjdimY0ISSMkjZA0QtIISSMkjZA0QtIISSMkjZA0QtIISSMkzcxrfMo/ya1lNgIAX1zq+ANHUjXZuAAAAABJRU5ErkJggg==' stop = b'iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAAAaklEQVRoge3ZQQqAMAxFwSre/8p6AZFUiXzKzLqLPNJVOwYAvLcVzpztU9Q8zrr/NUW3Y+JsZXsdSjdimY0ISSMkjZA0QtIISSMkjZA0QtIISSMkjZA0QtIISSMkzcxrfMo/ya1lNgIAX1zq+ANHUjXZuAAAAABJRU5ErkJggg=='
eject = b'iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAAByklEQVRoge3YO2gUURSA4S+JRnyACIGADyxERAsb0UKrWIidWIidlSA2YpFWSauNVtrYiIU2YpFCLGwEEWwsBAsLEbFQFARFfKBZizkyK5pkZvZmZ7PeH05z595z/sPszpxdMplMJpMZbDZFLGsm8CxiomWXxqzBQ3QiHmNdq0YNGMc9RQOvIjqxNt6iVy1GcF0h/h47sR1vY+0mRluzq8ElhfBn7O9a34tPce1KC161OK8Q/Y7D/7h+EF9jz7k+etXilELwJ44vsO8ofsTeM33wqsURpdzZCvtPK5s+toRetZjCF4XYTI1zM3HmGw4lt6rJbnxQCF1tcP5ynP2IPQm9arENb0LkDsYa5BjFrcjxDjuS2VVkI16EwH2s6iHXStxVvjy39GxXkfV4Iu3Y0T3OPMWGBDkXZDUeRMHnmEyY+/eA2cEjrE2Y+w/GcDsKvcbWJaixGS+jxixWpC4wgmvK+WlX6gJddM9lN6J2Mi4q56cDKRPPwz7lXHYhVdJp5W+KtmK61yZOYG4AGpnDyV6byWT+ZxZ7Rnf6YlGdeX2XxZ8AVag6AiR9uzZg0U/G0NyR3MigUfU7MmhPr78YmjuSyWQymUxmmPgFokSdfYSQKDwAAAAASUVORK5CYII=' eject = b'iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAAByklEQVRoge3YO2gUURSA4S+JRnyACIGADyxERAsb0UKrWIidWIidlSA2YpFWSauNVtrYiIU2YpFCLGwEEWwsBAsLEbFQFARFfKBZizkyK5pkZvZmZ7PeH05z595z/sPszpxdMplMJpMZbDZFLGsm8CxiomWXxqzBQ3QiHmNdq0YNGMc9RQOvIjqxNt6iVy1GcF0h/h47sR1vY+0mRluzq8ElhfBn7O9a34tPce1KC161OK8Q/Y7D/7h+EF9jz7k+etXilELwJ44vsO8ofsTeM33wqsURpdzZCvtPK5s+toRetZjCF4XYTI1zM3HmGw4lt6rJbnxQCF1tcP5ynP2IPQm9arENb0LkDsYa5BjFrcjxDjuS2VVkI16EwH2s6iHXStxVvjy39GxXkfV4Iu3Y0T3OPMWGBDkXZDUeRMHnmEyY+/eA2cEjrE2Y+w/GcDsKvcbWJaixGS+jxixWpC4wgmvK+WlX6gJddM9lN6J2Mi4q56cDKRPPwz7lXHYhVdJp5W+KtmK61yZOYG4AGpnDyV6byWT+ZxZ7Rnf6YlGdeX2XxZ8AVag6AiR9uzZg0U/G0NyR3MigUfU7MmhPr78YmjuSyWQymUxmmPgFokSdfYSQKDwAAAAASUVORK5CYII='
sg.change_look_and_feel('Light Green 3') # Set a color theme sg.theme('Light Green 3') # Set a color theme
bg = sg.LOOK_AND_FEEL_TABLE[sg.CURRENT_LOOK_AND_FEEL]['BACKGROUND'] # Get the background for the current theme bg = sg.LOOK_AND_FEEL_TABLE[sg.CURRENT_LOOK_AND_FEEL]['BACKGROUND'] # Get the background for the current theme

View File

@ -50,7 +50,7 @@ def GraphicButton(text, key, image_data, color=DEF_BUTTON_COLOR, size=(100, 50))
def ShowMeTheButtons(): def ShowMeTheButtons():
sg.change_look_and_feel('Black') sg.theme('Black')
frame_layout = [[sg.Text('Who says Windows have to be ugly when using tkinter?', size=(45, 3))], frame_layout = [[sg.Text('Who says Windows have to be ugly when using tkinter?', size=(45, 3))],
[sg.Text( [sg.Text(

View File

@ -6,7 +6,7 @@ A simple send/response chat window. Add call to your send-routine and print the
If async responses can come in, then will need to use a different design that uses PySimpleGUI async design pattern If async responses can come in, then will need to use a different design that uses PySimpleGUI async design pattern
''' '''
sg.change_look_and_feel('GreenTan') # give our window a spiffy set of colors sg.theme('GreenTan') # give our window a spiffy set of colors
layout = [[sg.Text('Your output will go here', size=(40, 1))], layout = [[sg.Text('Your output will go here', size=(40, 1))],
[sg.Output(size=(110, 20), font=('Helvetica 10'))], [sg.Output(size=(110, 20), font=('Helvetica 10'))],

View File

@ -15,7 +15,7 @@ Special keyboard keys:
def ChatBotWithHistory(): def ChatBotWithHistory():
# ------- Make a new Window ------- # # ------- Make a new Window ------- #
# give our form a spiffy set of colors # give our form a spiffy set of colors
sg.change_look_and_feel('GreenTan') sg.theme('GreenTan')
layout = [[sg.Text('Your output will go here', size=(40, 1))], layout = [[sg.Text('Your output will go here', size=(40, 1))],
[sg.Output(size=(127, 30), font=('Helvetica 10'))], [sg.Output(size=(127, 30), font=('Helvetica 10'))],

View File

@ -13,7 +13,7 @@ to collect user input that is sent to the chatbot. The reply is displayed in th
# Create the 'Trainer GUI' # Create the 'Trainer GUI'
# The Trainer GUI consists of a lot of progress bars stacked on top of each other # The Trainer GUI consists of a lot of progress bars stacked on top of each other
sg.change_look_and_feel('GreenTan') sg.theme('GreenTan')
# sg.DebugWin() # sg.DebugWin()
MAX_PROG_BARS = 20 # number of training sessions MAX_PROG_BARS = 20 # number of training sessions
bars = [] bars = []

View File

@ -16,7 +16,7 @@ to collect user input that is sent to the chatbot. The reply is displayed in th
# Create the 'Trainer GUI' # Create the 'Trainer GUI'
# The Trainer GUI consists of a lot of progress bars stacked on top of each other # The Trainer GUI consists of a lot of progress bars stacked on top of each other
sg.change_look_and_feel('NeutralBlue') sg.theme('NeutralBlue')
# sg.DebugWin() # sg.DebugWin()
MAX_PROG_BARS = 20 # number of training sessions MAX_PROG_BARS = 20 # number of training sessions
bars = [] bars = []

View File

@ -1,5 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python
import sys
import PySimpleGUI as sg import PySimpleGUI as sg
reverse = {} reverse = {}

View File

@ -662,7 +662,7 @@ def popup_color_chooser(look_and_feel=None):
old_look_and_feel = None old_look_and_feel = None
if look_and_feel is not None: if look_and_feel is not None:
old_look_and_feel = sg.CURRENT_LOOK_AND_FEEL old_look_and_feel = sg.CURRENT_LOOK_AND_FEEL
sg.change_look_and_feel(look_and_feel) sg.theme(look_and_feel)
button_size = (1, 1) button_size = (1, 1)
@ -697,12 +697,12 @@ def popup_color_chooser(look_and_feel=None):
color_chosen = event[1] color_chosen = event[1]
window.close() window.close()
if old_look_and_feel is not None: if old_look_and_feel is not None:
sg.change_look_and_feel(old_look_and_feel) sg.theme(old_look_and_feel)
return color_chosen return color_chosen
if __name__ == '__main__': if __name__ == '__main__':
sg.change_look_and_feel('Light Brown 4') sg.theme('Light Brown 4')
layout = [[sg.In(key='-CHOICE-'), sg.B('Color Picker')], layout = [[sg.In(key='-CHOICE-'), sg.B('Color Picker')],
[sg.Ok(), sg.Cancel()]] [sg.Ok(), sg.Cancel()]]
window = sg.Window('My application', layout) window = sg.Window('My application', layout)

View File

@ -1,5 +1,5 @@
#!/usr/bin/env python #!/usr/bin/env python
import PySimpleGUIQt as sg import PySimpleGUI as sg
""" """
@ -665,6 +665,7 @@ color_map = {
'YellowGreen': '#9ACD32', 'YellowGreen': '#9ACD32',
} }
sg.popup_quick_message('Building your table... one moment please...', background_color='red', text_color='white', font='Any 14')
sg.set_options(button_element_size=(12, 1), sg.set_options(button_element_size=(12, 1),
element_padding=(0, 0), element_padding=(0, 0),
@ -672,12 +673,8 @@ sg.set_options(button_element_size=(12, 1),
border_width=1, tooltip_time=100) border_width=1, tooltip_time=100)
# start layout with the tittle # start layout with the tittle
layout = [ layout = [[sg.Text('Hover mouse to see RGB value, click for white & black text',
[sg.Text('Hover mouse to see RGB value, click for white & black text', justification='center', text_color='blue', background_color='light green', size=(90, 1), font='Default 14', pad=(0, (0, 20)))]]
justification='center',
text_color='blue', background_color='light green',
size=(100, 1), pad=(0, (0, 20)))]
]
# -- Create primary color viewer window -- # -- Create primary color viewer window --
color_list = [key for key in color_map] color_list = [key for key in color_map]
@ -694,7 +691,7 @@ for rows in range(40):
layout.append(row) layout.append(row)
window = sg.Window('Color Viewer', layout, grab_anywhere=False, font=('any 9'), element_padding=(0,0), border_depth=0) window = sg.Window('Color Viewer', layout, font='Any 9', element_padding=(0,0), border_depth=0)
# -- Event loop -- # -- Event loop --
while True: while True:

View File

@ -1,16 +1,6 @@
# this one long import has the effect of making the code more compact as there is no 'sg.' prefix required for Elements # this one long import has the effect of making the code more compact as there is no 'sg.' prefix required for Elements
import PySimpleGUI as sg import PySimpleGUI as sg
from PySimpleGUI import InputCombo, Combo, Multiline, ML, from PySimpleGUI import InputCombo, Combo, Multiline, ML, MLine, Checkbox, CB, Check, Button, B, Btn, ButtonMenu, Canvas, Column, Col, Combo, Frame, Graph, Image, InputText, Input, In, Listbox, LBox, Menu, Multiline, ML, MLine, OptionMenu, Output, Pane, ProgressBar, Radio, Slider, Spin, StatusBar, Tab, TabGroup, Table, Text, Txt, T, Tree, TreeData, VerticalSeparator, Window, Sizer
MLine, Checkbox, CB, Check,
Button, B, Btn, ButtonMenu,
Canvas, Column, Col, Combo,
Frame, Graph, Image, InputText,
Input, In, Listbox, LBox, Menu,
Multiline, ML, MLine, OptionMenu,
Output, Pane, ProgressBar, Radio,
Slider, Spin, StatusBar, Tab,
TabGroup, Table, Text, Txt, T,
Tree, TreeData, VerticalSeparator, Window, Sizer
""" """
Demo Columns and Frames Demo Columns and Frames
@ -22,7 +12,7 @@ from PySimpleGUI import InputCombo, Combo, Multiline, ML,
There are 3 columns. Two are side by side at the top and the third is along the bottom There are 3 columns. Two are side by side at the top and the third is along the bottom
""" """
sg.change_look_and_feel('GreenTan') sg.theme('GreenTan')
col2 = Column([[Frame('Accounts:', [[Column([[Listbox(['Account '+str(i) for i in range(1, 16)], col2 = Column([[Frame('Accounts:', [[Column([[Listbox(['Account '+str(i) for i in range(1, 16)],
key='-ACCT-LIST-', size=(15, 20)), ]], size=(150, 400))]])]], pad=(0, 0)) key='-ACCT-LIST-', size=(15, 20)), ]], size=(150, 400))]])]], pad=(0, 0))

View File

@ -5,7 +5,7 @@ import PySimpleGUI as sg
Usage of Column Element Usage of Column Element
''' '''
sg.change_look_and_feel('BlueMono') sg.theme('BlueMono')
css = {'text_color': 'white', 'background_color': 'blue'} css = {'text_color': 'white', 'background_color': 'blue'}
# Column layout # Column layout

View File

@ -5,7 +5,7 @@ import PySimpleGUI as sg
Simple "diff" in PySimpleGUI Simple "diff" in PySimpleGUI
''' '''
sg.change_look_and_feel('Dark Blue 3') sg.theme('Dark Blue 3')
def GetFilesToCompare(): def GetFilesToCompare():
form_rows = [[sg.Text('Enter 2 files to comare')], form_rows = [[sg.Text('Enter 2 files to comare')],

View File

@ -142,7 +142,7 @@ class GameOfLife:
line_color='black', fill_color='yellow') line_color='black', fill_color='yellow')
event, values = self.window.read(timeout=self.delay) event, values = self.window.read(timeout=self.delay)
if event in (None, '-DONE-'): if event in (None, '-DONE-'):
return exit()
self.delay = values['-SLIDER-'] self.delay = values['-SLIDER-']
self.T = int(values['-SLIDER2-']) self.T = int(values['-SLIDER2-'])
self.window['-S1-OUT-'].update(values['-SLIDER-']) self.window['-S1-OUT-'].update(values['-SLIDER-'])

View File

@ -12,7 +12,7 @@ import webbrowser
# Here is a more complete list of cursors you can choose from # Here is a more complete list of cursors you can choose from
cursors = ('X_cursor', 'no', 'arrow','based_arrow_down','based_arrow_up','boat','bogosity','bottom_left_corner','bottom_right_corner','bottom_side','bottom_tee','box_spiral','center_ptr','circle','clock','coffee_mug','cross','cross_reverse','crosshair','diamond_cross','dot','dotbox','double_arrow','draft_large','draft_small','draped_box','exchange','fleur','gobbler','gumby','hand1','hand2','heart','icon','iron_cross','left_ptr','left_side','left_tee','leftbutton','ll_angle','lr_angle','man','middlebutton','mouse','no','pencil','pirate','plus','question_arrow','right_ptr','right_side','right_tee','rightbutton','rtl_logo','sailboat','sb_down_arrow','sb_h_double_arrow','sb_left_arrow','sb_right_arrow','sb_up_arrow','sb_v_double_arrow','shuttle','sizing','spider','spraycan','star','target','tcross','top_left_arrow','top_left_corner','top_right_corner','top_side','top_tee','trek','ul_angle','umbrella','ur_angle','watch','xterm','arrow','center_ptr','crosshair','fleur','ibeam','icon','sb_h_double_arrow','sb_v_double_arrow','watch','xterm','no','starting','size','size_ne_sw','size_ns','size_nw_se','size_we','uparrow','wait','arrow','cross','crosshair','ibeam','plus','watch','xterm') cursors = ('X_cursor', 'no', 'arrow','based_arrow_down','based_arrow_up','boat','bogosity','bottom_left_corner','bottom_right_corner','bottom_side','bottom_tee','box_spiral','center_ptr','circle','clock','coffee_mug','cross','cross_reverse','crosshair','diamond_cross','dot','dotbox','double_arrow','draft_large','draft_small','draped_box','exchange','fleur','gobbler','gumby','hand1','hand2','heart','icon','iron_cross','left_ptr','left_side','left_tee','leftbutton','ll_angle','lr_angle','man','middlebutton','mouse','no','pencil','pirate','plus','question_arrow','right_ptr','right_side','right_tee','rightbutton','rtl_logo','sailboat','sb_down_arrow','sb_h_double_arrow','sb_left_arrow','sb_right_arrow','sb_up_arrow','sb_v_double_arrow','shuttle','sizing','spider','spraycan','star','target','tcross','top_left_arrow','top_left_corner','top_right_corner','top_side','top_tee','trek','ul_angle','umbrella','ur_angle','watch','xterm','arrow','center_ptr','crosshair','fleur','ibeam','icon','sb_h_double_arrow','sb_v_double_arrow','watch','xterm','no','starting','size','size_ne_sw','size_ns','size_nw_se','size_we','uparrow','wait','arrow','cross','crosshair','ibeam','plus','watch','xterm')
sg.change_look_and_feel('Light Blue 2') sg.theme('Light Blue 2')
layout = [ [sg.Text('Here is a clickable link for you')], layout = [ [sg.Text('Here is a clickable link for you')],
[sg.Text('Notice how the cursor switches to a "hand" when hover over the link')], [sg.Text('Notice how the cursor switches to a "hand" when hover over the link')],
@ -21,18 +21,16 @@ layout = [ [sg.Text('Here is a clickable link for you')],
[sg.Text('watch - This makes the spinning-donut-of-death cursor on Windows', key='-WATCH-')], [sg.Text('watch - This makes the spinning-donut-of-death cursor on Windows', key='-WATCH-')],
[sg.Text('fleur - The "Move" cursor', key='-FLEUR-')], [sg.Text('fleur - The "Move" cursor', key='-FLEUR-')],
[sg.Text('trek - Beam me up Scotty!', key='-TREK-')], [sg.Text('trek - Beam me up Scotty!', key='-TREK-')],
# [sg.Text('watch -', key='-WATCH-')],
# [sg.Text('watch -', key='-WATCH LEFT-')],
[sg.Button('Exit')] ] [sg.Button('Exit')] ]
window = sg.Window('Window Title', layout, finalize=True) window = sg.Window('Window Title', layout, finalize=True)
# Directly interact with the tkinter widget, changing the cursor shown when placed cursor is over this element # Directly interact with the tkinter widget, changing the cursor shown when placed cursor is over this element
window['-LINK-'].Widget.config(cursor='hand2') window['-LINK-'].set_cursor(cursor='hand2')
window['-WATCH-'].Widget.config(cursor='watch') window['-WATCH-'].set_cursor(cursor='watch')
window['-FLEUR-'].Widget.config(cursor='fleur') window['-FLEUR-'].set_cursor(cursor='fleur')
window['-TREK-'].Widget.config(cursor='trek') window['-TREK-'].set_cursor(cursor='trek')
window['Exit'].Widget.config(cursor='no') window['Exit'].set_cursor(cursor='no')
while True: # Event Loop while True: # Event Loop
event, values = window.read() event, values = window.read()

View File

@ -8,10 +8,11 @@ import PySimpleGUI as sg
3. There is a safeguard to stop from launching multiple copies of window2. Only 1 window2 is visible at a time 3. There is a safeguard to stop from launching multiple copies of window2. Only 1 window2 is visible at a time
""" """
sg.theme('Dark Blue 3')
# Window 1 layout # Window 1 layout
layout = [ layout = [
[sg.Text('This is the FIRST WINDOW'), sg.Text(' ', key='-OUTPUT-')], [sg.Text('This is the FIRST WINDOW'), sg.Text(' ', key='-OUTPUT-')],
[sg.Text('')], [sg.Text()],
[sg.Button('Launch 2nd Window'), sg.Button('Popup'), sg.Button('Exit')] [sg.Button('Launch 2nd Window'), sg.Button('Popup'), sg.Button('Exit')]
] ]
@ -31,8 +32,8 @@ while True: # Event Loop
win2_active = True win2_active = True
# window 2 layout - note - must be "new" every time a window is created # window 2 layout - note - must be "new" every time a window is created
layout2 = [ layout2 = [
[sg.Text('The second window'), sg.Text('', key='-OUTPUT-')], [sg.Text('The second window')],
[sg.Input('', key='-IN-')], [sg.Input(key='-IN-')],
[sg.Button('Show'), sg.Button('Exit')] [sg.Button('Show'), sg.Button('Exit')]
] ]
window2 = sg.Window('Second Window', layout2) window2 = sg.Window('Second Window', layout2)

View File

@ -8,13 +8,14 @@ import PySimpleGUI as sg
# Design pattern 2 - First window remains active # Design pattern 2 - First window remains active
layout = [[ sg.Text('Window 1'),], layout = [[ sg.Text('Window 1'),],
[sg.Input('')], [sg.Input()],
[sg.Text('', size=(20,1), key='-OUTPUT-')], [sg.Text('', size=(20,1), key='-OUTPUT-')],
[sg.Button('Launch 2'), sg.Button('Exit')]] [sg.Button('Launch 2'), sg.Button('Exit')]]
window1 = sg.Window('Window 1', layout) window1 = sg.Window('Window 1', layout)
window2_active = False window2_active = False
while True: while True:
event1, values1 = window1.read(timeout=100) event1, values1 = window1.read(timeout=100)
window1['-OUTPUT-'].update(values1[0]) window1['-OUTPUT-'].update(values1[0])

View File

@ -5,7 +5,7 @@ import PySimpleGUI as sg
''' '''
layout = [[sg.Text('Window 1'), ], layout = [[sg.Text('Window 1'), ],
[sg.Input('')], [sg.Input()],
[sg.Text('',size=(20,1), key='-OUTPUT-')], [sg.Text('',size=(20,1), key='-OUTPUT-')],
[sg.Button('Next >'), sg.Button('Exit')]] [sg.Button('Next >'), sg.Button('Exit')]]

View File

@ -11,7 +11,7 @@ These are the accepted design patterns that cover the two primary use cases
# ---------------------------------# # ---------------------------------#
import PySimpleGUI as sg import PySimpleGUI as sg
sg.change_look_and_feel('Dark Blue 3') sg.theme('Dark Blue 3')
layout = [[ sg.Text('My Oneshot') ], layout = [[ sg.Text('My Oneshot') ],
[ sg.Button('OK') ]] [ sg.Button('OK') ]]
@ -26,7 +26,7 @@ window.close()
# -------------------------------------# # -------------------------------------#
import PySimpleGUI as sg import PySimpleGUI as sg
sg.change_look_and_feel('Dark Blue 3') sg.theme('Dark Blue 3')
layout = [[ sg.Text('My layout', text_color='red') ], layout = [[ sg.Text('My layout', text_color='red') ],
[ sg.Input(key='-INPUT-')], [ sg.Input(key='-INPUT-')],
@ -45,7 +45,7 @@ window.close()
# ------------------------------------------------------------------# # ------------------------------------------------------------------#
import PySimpleGUI as sg import PySimpleGUI as sg
sg.change_look_and_feel('Dark Blue 3') sg.theme('Dark Blue 3')
layout = [[ sg.Text('My layout', key='-TEXT-KEY-') ], layout = [[ sg.Text('My layout', key='-TEXT-KEY-') ],
[ sg.Button('OK'), sg.Button('Cancel') ]] [ sg.Button('OK'), sg.Button('Cancel') ]]

View File

@ -19,7 +19,7 @@ ROOT_PATH = './'
def Launcher(): def Launcher():
sg.change_look_and_feel('Dark') sg.theme('Dark')
namesonly = [f for f in os.listdir(ROOT_PATH) if f.endswith('.py')] namesonly = [f for f in os.listdir(ROOT_PATH) if f.endswith('.py')]

View File

@ -54,7 +54,7 @@ def main():
num_cores = len(psutil.cpu_percent(percpu=True)) # get the number of cores in the CPU num_cores = len(psutil.cpu_percent(percpu=True)) # get the number of cores in the CPU
sg.change_look_and_feel('Black') sg.theme('Black')
sg.set_options(element_padding=(0,0), margins=(1,1), border_width=0) sg.set_options(element_padding=(0,0), margins=(1,1), border_width=0)
# the clever Red X graphic # the clever Red X graphic

View File

@ -33,7 +33,7 @@ def main():
global g_exit, g_response_time global g_exit, g_response_time
# start ping measurement thread # start ping measurement thread
sg.change_look_and_feel('Black') sg.theme('Black')
sg.set_options(element_padding=(0, 0)) sg.set_options(element_padding=(0, 0))
layout = [ layout = [

View File

@ -40,7 +40,7 @@ def main():
global g_interval, g_procs, g_exit global g_interval, g_procs, g_exit
# ---------------- Create Form ---------------- # ---------------- Create Form ----------------
sg.change_look_and_feel('Black') sg.theme('Black')
layout = [ layout = [
[sg.Text('', size=(8, 1), font=('Helvetica', 20), [sg.Text('', size=(8, 1), font=('Helvetica', 20),
text_color=sg.YELLOWS[0], justification='center', key='text')], text_color=sg.YELLOWS[0], justification='center', key='text')],

View File

@ -5,7 +5,7 @@ import psutil
# Yet another usage of CPU data # Yet another usage of CPU data
# ---------------- Create Form ---------------- # ---------------- Create Form ----------------
sg.change_look_and_feel('Black') sg.theme('Black')
layout = [[sg.Text('CPU Utilization')], layout = [[sg.Text('CPU Utilization')],
[sg.Text('', size=(8, 2), font=('Helvetica', 20), [sg.Text('', size=(8, 2), font=('Helvetica', 20),

View File

@ -20,7 +20,7 @@ MAX_EMAILS = 10
def gui(): def gui():
sg.change_look_and_feel('Topanga') sg.theme('Topanga')
sg.set_options(border_width=0, margins=(0, 0), element_padding=(4, 0)) sg.set_options(border_width=0, margins=(0, 0), element_padding=(4, 0))
color = ('#282923', '#282923') color = ('#282923', '#282923')
layout = [[sg.Text('Email New Mail Notification' + 48 * ' '), layout = [[sg.Text('Email New Mail Notification' + 48 * ' '),

View File

@ -20,7 +20,7 @@ def time_as_int():
# ---------------- Create Form ---------------- # ---------------- Create Form ----------------
sg.change_look_and_feel('Black') sg.theme('Black')
layout = [[sg.Text('')], layout = [[sg.Text('')],
[sg.Text('', size=(8, 2), font=('Helvetica', 20), [sg.Text('', size=(8, 2), font=('Helvetica', 20),

View File

@ -56,7 +56,7 @@ def human_size(bytes, units=[' bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB']):
def main(): def main():
# ---------------- Create Window ---------------- # ---------------- Create Window ----------------
sg.change_look_and_feel('Black') sg.theme('Black')
sg.set_options(element_padding=(0, 0), margins=(1, 1), border_width=0) sg.set_options(element_padding=(0, 0), margins=(1, 1), border_width=0)
def GraphColumn(name, key): def GraphColumn(name, key):

View File

@ -5,7 +5,7 @@ import PySimpleGUI as sg
Usage of Disable elements Usage of Disable elements
''' '''
sg.change_look_and_feel('Dark') sg.theme('Dark')
sg.set_options(element_padding=(0, 0)) sg.set_options(element_padding=(0, 0))
layout = [ layout = [

View File

@ -9,7 +9,7 @@ import os
''' '''
def Launcher(): def Launcher():
sg.change_look_and_feel('LightGreen') sg.theme('LightGreen')
layout = [[sg.Text('PyInstaller EXE Creator', font='Any 15')], layout = [[sg.Text('PyInstaller EXE Creator', font='Any 15')],
[sg.Text('Source Python File'), sg.Input(key='-sourcefile-', size=(45, 1)), [sg.Text('Source Python File'), sg.Input(key='-sourcefile-', size=(45, 1)),

View File

@ -61,7 +61,7 @@ def send_an_email(from_address, to_address, subject, message_text, user, passwor
''' '''
def main(): def main():
sg.change_look_and_feel('Dark Blue 3') sg.theme('Dark Blue 3')
layout = [[sg.Text('Send an Email', font='Default 18')], layout = [[sg.Text('Send an Email', font='Default 18')],
[sg.T('From:', size=(8,1)), sg.Input(key='-EMAIL FROM-', size=(35,1))], [sg.T('From:', size=(8,1)), sg.Input(key='-EMAIL FROM-', size=(35,1))],
[sg.T('To:', size=(8,1)), sg.Input(key='-EMAIL TO-', size=(35,1))], [sg.T('To:', size=(8,1)), sg.Input(key='-EMAIL TO-', size=(35,1))],

View File

@ -12,7 +12,7 @@ import PySimpleGUI as sg
Second parameter for windows is an entire key, for elements is something added onto a key. This key or modified key is what is returned when you read the window. Second parameter for windows is an entire key, for elements is something added onto a key. This key or modified key is what is returned when you read the window.
If the key modifier is text and the key is text, then the key returned from the read will be the 2 concatenated together. Otherwise your event will be a tuple containing the key_modifier value you pass in and the key belonging to the element the event happened to. If the key modifier is text and the key is text, then the key returned from the read will be the 2 concatenated together. Otherwise your event will be a tuple containing the key_modifier value you pass in and the key belonging to the element the event happened to.
""" """
sg.change_look_and_feel('Dark Blue 3') sg.theme('Dark Blue 3')
layout = [ [sg.Text('Move mouse over me', key='-TEXT-')], layout = [ [sg.Text('Move mouse over me', key='-TEXT-')],
[sg.In(key='-IN-')], [sg.In(key='-IN-')],

View File

@ -6,7 +6,7 @@ import PySimpleGUI as sg
''' '''
def main(): def main():
sg.change_look_and_feel('TanBlue') sg.theme('TanBlue')
column1 = [ column1 = [
[sg.Text('Column 1', background_color=sg.DEFAULT_BACKGROUND_COLOR, [sg.Text('Column 1', background_color=sg.DEFAULT_BACKGROUND_COLOR,

View File

@ -12,7 +12,7 @@ root.destroy()
Showing fonts in PSG / tk Showing fonts in PSG / tk
''' '''
sg.change_look_and_feel('Black') sg.theme('Black')
layout = [[sg.Text('My Text Element', layout = [[sg.Text('My Text Element',
size=(20, 1), size=(20, 1),

View File

@ -0,0 +1,32 @@
#!/usr/bin/env python
import PySimpleGUI as sg
from random import randint
def Battleship():
sg.theme('Dark Blue 3')
MAX_ROWS = MAX_COL = 10
# Start building layout with the top 2 rows that contain Text elements
layout = [[sg.Text('BATTLESHIP', font='Default 25')],
[sg.Text(size=(15,1), key='-MESSAGE-', font='Default 20')]]
# Add the board, a grid a buttons
layout += [[sg.Button(str('O'), size=(4, 2), pad=(0,0), border_width=0, key=(row,col)) for col in range(MAX_COL)] for row in range(MAX_ROWS)]
# Add the exit button as the last row
layout += [[sg.Button('Exit', button_color=('white', 'red'))]]
window = sg.Window('Battleship', layout)
while True: # The Event Loop
event, values = window.read()
print(event, values)
if event in (None, 'Exit'):
break
if randint(1,10) < 5: # simulate a hit or a miss
window[event].update('H', button_color=('white','red'))
window['-MESSAGE-'].update('Hit')
else:
window[event].update('M', button_color=('white','black'))
window['-MESSAGE-'].update('Miss')
window.close()
Battleship()

View File

@ -0,0 +1,41 @@
#!/usr/bin/env python
import PySimpleGUI as sg
from random import randint
def Battleship():
sg.theme('Dark Blue 3')
MAX_ROWS = MAX_COL = 10
# Start building layout with the top 2 rows that contain Text elements
layout = [[sg.Text('BATTLESHIP', font='Default 25')],
[sg.Text(size=(15,1), key='-MESSAGE-', font='Default 20')]]
# Build the "board", a grid of Buttons
board = []
for row in range(MAX_ROWS):
layout_row = []
for col in range(MAX_COL):
layout_row.append(sg.Button(str('O'), size=(4, 2), pad=(0,0), border_width=0, key=(row,col)))
board.append(layout_row)
# Add the board to the layout
layout += board
# Add the exit button as the last row
layout += [[sg.Button('Exit', button_color=('white', 'red'))]]
window = sg.Window('Battleship', layout)
while True: # The Event Loop
event, values = window.read()
print(event, values)
if event in (None, 'Exit'):
break
if randint(1,10) < 5: # simulate a hit or a miss
window[event].update('H', button_color=('white','red'))
window['-MESSAGE-'].update('Hit')
else:
window[event].update('M', button_color=('white','black'))
window['-MESSAGE-'].update('Miss')
window.close()
Battleship()

View File

@ -0,0 +1,35 @@
#!/usr/bin/env python
import PySimpleGUI as sg
from random import randint
def Battleship():
sg.theme('Dark Blue 3')
MAX_ROWS = MAX_COL = 10
# Start building layout with the top 2 rows that contain Text elements
layout = [[sg.Text('BATTLESHIP', font='Default 25')],
[sg.Text(size=(15,1), key='-MESSAGE-', font='Default 20')]]
# Build the "board", a grid of Buttons
board = []
for row in range(MAX_ROWS):
board.append([sg.Button(str('O'), size=(4, 2), pad=(0,0), border_width=0, key=(row,col)) for col in range(MAX_COL)])
# Add the board and the exit button to the layout
layout += board
# Add the exit button as the last row
layout += [[sg.Button('Exit', button_color=('white', 'red'))]]
window = sg.Window('Battleship', layout)
while True: # The Event Loop
event, values = window.read()
print(event, values)
if event in (None, 'Exit'):
break
if randint(1,10) < 5: # simulate a hit or a miss
window[event].update('H', button_color=('white','red'))
window['-MESSAGE-'].update('Hit')
else:
window[event].update('M', button_color=('white','black'))
window['-MESSAGE-'].update('Miss')
window.close()
Battleship()

View File

@ -8,24 +8,25 @@ import PySimpleGUI as sg
see in things like editors see in things like editors
""" """
# image_file = r'Color-names.png' # image_file = r'Color-names.png'
image_file = None # image is optional # image_file = None # image is optional
image_file = r'C:\Python\PycharmProjects\GooeyGUI\logo200.png' # image is optional
layout = [[sg.Graph( layout = [[sg.Graph(
canvas_size=(400, 400), canvas_size=(400, 400),
graph_bottom_left=(0, 400), graph_bottom_left=(0, 0),
graph_top_right=(400, 0), graph_top_right=(400, 400),
key="-GRAPH-", key="-GRAPH-",
change_submits=True, # mouse click events change_submits=True, # mouse click events
drag_submits=True),], background_color='lightblue',
[sg.Text(key='info', size=(60, 1))]] drag_submits=True), ],
[sg.Text(key='info', size=(60, 1))]]
window = sg.Window("draw rect on image", layout, finalize=True) window = sg.Window("draw rect on image", layout, finalize=True)
# get the graph element for ease of use later # get the graph element for ease of use later
graph = window["-GRAPH-"] # type: sg.Graph graph = window["-GRAPH-"] # type: sg.Graph
graph.draw_image(image_file, location=(0,0)) if image_file else None graph.draw_image(image_file, location=(0,400)) if image_file else None
dragging = False dragging = False
start_point = end_point = prior_rect = None start_point = end_point = prior_rect = None
@ -34,8 +35,8 @@ while True:
if event is None: if event is None:
break # exit break # exit
if event == "-GRAPH-": # if there's a "Graph" event, then it's a mouse if event == "-GRAPH-": # if there's a "Graph" event, then it's a mouse
x, y = values["-GRAPH-"] x, y = values["-GRAPH-"]
if not dragging: if not dragging:
start_point = (x, y) start_point = (x, y)
@ -46,12 +47,12 @@ while True:
graph.delete_figure(prior_rect) graph.delete_figure(prior_rect)
if None not in (start_point, end_point): if None not in (start_point, end_point):
prior_rect = graph.draw_rectangle(start_point, end_point, line_color='red') prior_rect = graph.draw_rectangle(start_point, end_point, line_color='red')
elif event.endswith('+UP'): # The drawing has ended because mouse up elif event.endswith('+UP'): # The drawing has ended because mouse up
info = window["info"] info = window["info"]
info.update(value=f"grabbed rectangle from {start_point} to {end_point}") info.update(value=f"grabbed rectangle from {start_point} to {end_point}")
start_point, end_point = None, None # enable grabbing a new rect start_point, end_point = None, None # enable grabbing a new rect
dragging = False dragging = False
else: else:
print("unhandled event", event, values) print("unhandled event", event, values)

View File

@ -3,7 +3,7 @@ import PySimpleGUI as sg
# Usage of Graph element. # Usage of Graph element.
layout = [[sg.Graph(canvas_size=(400, 400), graph_bottom_left=(0, 0), graph_top_right=(400, 400), background_color='red', key='graph')], layout = [[sg.Graph(canvas_size=(400, 400), graph_bottom_left=(0, 0), graph_top_right=(400, 400), background_color='red', enable_events=True, key='graph')],
[sg.Text('Change circle color to:'), sg.Button('Red'), sg.Button('Blue'), sg.Button('Move')]] [sg.Text('Change circle color to:'), sg.Button('Red'), sg.Button('Blue'), sg.Button('Move')]]
window = sg.Window('Graph test', layout, finalize=True) window = sg.Window('Graph test', layout, finalize=True)
@ -17,6 +17,7 @@ line = graph.draw_line((0, 0), (100, 100))
arc = graph.draw_arc((0, 0), (400, 400), 160, 10, style='arc', arc_color='blue') arc = graph.draw_arc((0, 0), (400, 400), 160, 10, style='arc', arc_color='blue')
while True: while True:
event, values = window.read() event, values = window.read()
print(event, values)
if event is None: if event is None:
break break
if event in ('Blue', 'Red'): if event in ('Blue', 'Red'):

View File

@ -27,7 +27,7 @@ def main():
thread = Thread(target=ping_thread, args=(None,)) thread = Thread(target=ping_thread, args=(None,))
thread.start() thread.start()
sg.change_look_and_feel('Black') sg.theme('Black')
sg.set_options(element_padding=(0, 0)) sg.set_options(element_padding=(0, 0))
layout = [ layout = [

View File

@ -23,6 +23,7 @@ def draw_axis():
if y != 0: if y != 0:
graph.draw_text(str(y), (-10, y), color='blue') graph.draw_text(str(y), (-10, y), color='blue')
sg.theme('DarkAmber')
# Create the graph that will be put into the window # Create the graph that will be put into the window
graph = sg.Graph(canvas_size=(400, 400), graph = sg.Graph(canvas_size=(400, 400),

View File

@ -7,7 +7,7 @@ import sys
Example of random line in Graph element. Example of random line in Graph element.
''' '''
sg.change_look_and_feel('black') sg.theme('black')
STEP_SIZE = 1 STEP_SIZE = 1
SAMPLES = 300 SAMPLES = 300
@ -32,7 +32,7 @@ def main():
# start ping measurement thread # start ping measurement thread
sg.change_look_and_feel('Black') sg.theme('Black')
sg.set_options(element_padding=(0, 0)) sg.set_options(element_padding=(0, 0))
layout = [[sg.Button('Quit', button_color=('white', 'black'))], layout = [[sg.Button('Quit', button_color=('white', 'black'))],
@ -75,7 +75,6 @@ def main():
graph.move_figure(figure, -STEP_SIZE, 0) graph.move_figure(figure, -STEP_SIZE, 0)
prev_x = prev_x - STEP_SIZE prev_x = prev_x - STEP_SIZE
# print(f'io={i} {prev_x,prev_y} to {new_x, new_y}')
last_figure = graph.draw_line((prev_x, prev_y), (new_x, new_y), color='white') last_figure = graph.draw_line((prev_x, prev_y), (new_x, new_y), color='white')
figures.append(last_figure) figures.append(last_figure)
prev_x, prev_y = new_x, new_y prev_x, prev_y = new_x, new_y

View File

@ -27,7 +27,7 @@ def main():
thread = Thread(target=ping_thread, args=(None,)) thread = Thread(target=ping_thread, args=(None,))
thread.start() thread.start()
sg.change_look_and_feel('Black') sg.theme('Black')
sg.set_options(element_padding=(0, 0)) sg.set_options(element_padding=(0, 0))
layout = [[sg.Text('Ping times to Google.com', font='Any 12'), layout = [[sg.Text('Ping times to Google.com', font='Any 12'),

View File

@ -21,7 +21,7 @@ def HowDoI():
''' '''
# ------- Make a new Window ------- # # ------- Make a new Window ------- #
# give our form a spiffy set of colors # give our form a spiffy set of colors
sg.change_look_and_feel('GreenTan') sg.theme('GreenTan')
layout = [ layout = [
[sg.Text('Ask and your answer will appear here....', size=(40, 1))], [sg.Text('Ask and your answer will appear here....', size=(40, 1))],

View File

@ -0,0 +1,52 @@
import PySimpleGUI as sg
'''
IP Address entry window with digit validation and auto advance
If not a digit or ., the ignored
. will advance the focus to the next entry
On the last input, once it's complete the focus moves to the OK button
Pressing spacebar with focus on OK generates an -OK- event
'''
# create a short-cut element so don't have to type this in over and over
def MyInput(key): return sg.I('', size=(3, 1), key=key, pad=(0, 2))
layout = [[sg.T('Your typed chars appear here:'), sg.T('', key='-OUTPUT-')],
[MyInput(0), sg.T('.'), MyInput(1), sg.T('.'),
MyInput(2), sg.T('.'), MyInput(3)],
[sg.B('Ok', key='-OK-', bind_return_key=True), sg.B('Exit')]]
window = sg.Window('Window Title', layout, return_keyboard_events=True)
while True: # Event Loop
event, values = window.read()
print(event)
if event is None or event == 'Exit':
break
elem = window.find_element_with_focus()
if elem is not None:
key = elem.Key
# get value of input field that has focus
value = values[key]
if event == '.' and key != '-OK-': # if a ., then advance to next field
elem.update(value[:-1])
value = value[:-1]
next_elem = window[key+1]
next_elem.set_focus()
elif event not in '0123456789':
elem.update(value[:-1])
elif len(value) > 2 and key < 3: # if 2 digits typed in, move on to next input
next_elem = window[key+1]
next_elem.set_focus()
elif len(value) > 2 and key == 3:
window['-OK-'].set_focus()
print('You entered IP Address {}.{}.{}.{}'.format(*values.values()))
window.close()

View File

@ -10,6 +10,8 @@ PLAYER_COMMAND_PAUSE = 2
PLAYER_COMMAND_NEXT = 3 PLAYER_COMMAND_NEXT = 3
PLAYER_COMMAND_RESTART_SONG = 4 PLAYER_COMMAND_RESTART_SONG = 4
helv15 = 'Helvetica 15'
# ---------------------------------------------------------------------- # # ---------------------------------------------------------------------- #
# PlayerGUI CLASS # # PlayerGUI CLASS #
# ---------------------------------------------------------------------- # # ---------------------------------------------------------------------- #

View File

@ -846,7 +846,7 @@ fig_dict = {'Pyplot Simple':PyplotSimple, 'Pyplot Formatstr':PyplotFormatstr,'Py
'Pyplot Scatter With Legend' :PyplotScatterWithLegend, 'Artist Customized Box Plots' : PyplotArtistBoxPlots, 'Pyplot Scatter With Legend' :PyplotScatterWithLegend, 'Artist Customized Box Plots' : PyplotArtistBoxPlots,
'Artist Customized Box Plots 2' : ArtistBoxplot2, 'Pyplot Histogram' : PyplotHistogram} 'Artist Customized Box Plots 2' : ArtistBoxplot2, 'Pyplot Histogram' : PyplotHistogram}
sg.change_look_and_feel('LightGreen') sg.theme('LightGreen')
figure_w, figure_h = 650, 650 figure_w, figure_h = 650, 650
# define the form layout # define the form layout

View File

@ -865,7 +865,7 @@ fig_dict = {'Pyplot Simple': PyplotSimple, 'Pyplot Formatstr': PyplotFormatstr,
'Artist Customized Box Plots 2': ArtistBoxplot2, 'Pyplot Histogram': PyplotHistogram} 'Artist Customized Box Plots 2': ArtistBoxplot2, 'Pyplot Histogram': PyplotHistogram}
sg.change_look_and_feel('LightGreen') sg.theme('LightGreen')
figure_w, figure_h = 650, 650 figure_w, figure_h = 650, 650
# define the form layout # define the form layout
listbox_values = list(fig_dict) listbox_values = list(fig_dict)

View File

@ -1,4 +1,6 @@
from matplotlib import use
import PySimpleGUI as sg import PySimpleGUI as sg
# import PySimpleGUIQt as sg; use('qt5agg')
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
""" """
@ -8,8 +10,12 @@ import matplotlib.pyplot as plt
It turns out to be a rather simple thing to do. The secret is to add parameter block=False to plt.show() It turns out to be a rather simple thing to do. The secret is to add parameter block=False to plt.show()
""" """
def draw_plot():
plt.plot([0.1, 0.2, 0.5, 0.7])
plt.show(block=False)
layout = [[sg.Button('Plot'), sg.Cancel(), sg.Button('Popup')]] layout = [[sg.Button('Plot'), sg.Cancel(), sg.Button('Popup')]]
window = sg.Window('Have some Matplotlib....', layout) window = sg.Window('Have some Matplotlib....', layout)
while True: while True:
@ -17,9 +23,7 @@ while True:
if event in (None, 'Cancel'): if event in (None, 'Cancel'):
break break
elif event == 'Plot': elif event == 'Plot':
history = [0.1, 0.2, 0.5, 0.7] draw_plot()
plt.plot(history)
plt.show(block=False)
elif event == 'Popup': elif event == 'Popup':
sg.popup('Yes, your application is still running') sg.popup('Yes, your application is still running')
window.close() window.close()

View File

@ -13,10 +13,10 @@ from sys import platform as PLATFORM
#------- GUI definition & setup --------# #------- GUI definition & setup --------#
sg.change_look_and_feel('DarkBlue') sg.theme('DarkBlue')
def btn(name): # a PySimpleGUI "User Defined Element" (see docs) def btn(name): # a PySimpleGUI "User Defined Element" (see docs)
return sg. Button(name, size=(6, 1), pad=(1, 1)) return sg.Button(name, size=(6, 1), pad=(1, 1))
layout = [[sg.Input(default_text='Video URL or Local Path:', size=(30, 1), key='-VIDEO_LOCATION-'), sg.Button('load')], layout = [[sg.Input(default_text='Video URL or Local Path:', size=(30, 1), key='-VIDEO_LOCATION-'), sg.Button('load')],
[sg.Image('', size=(300, 170), key='-VID_OUT-')], [sg.Image('', size=(300, 170), key='-VID_OUT-')],

View File

@ -20,40 +20,43 @@ def second_window():
def test_menus(): def test_menus():
sg.change_look_and_feel('LightGreen') sg.theme('LightGreen')
sg.set_options(element_padding=(0, 0)) sg.set_options(element_padding=(0, 0))
# ------ Menu Definition ------ # # ------ Menu Definition ------ #
menu_def = [['&File', ['&Open', '&Save', '&Properties', 'E&xit']], menu_def = [['&File', ['&Open Ctrl-O', '&Save Ctrl-S', '&Properties', 'E&xit']],
['&Edit', ['&Paste', ['Special', 'Normal', ], 'Undo'], ], ['&Edit', ['&Paste', ['Special', 'Normal', ], 'Undo'], ],
['&Toolbar', ['---', 'Command &1', 'Command &2', ['&Toolbar', ['---', 'Command &1', 'Command &2',
'---', 'Command &3', 'Command &4']], '---', 'Command &3', 'Command &4']],
['&Help', '&About...'], ] ['&Help', '&About...'], ]
right_click_menu = ['Unused', ['Right', '!&Click', '&Menu', 'E&xit', 'Properties']]
# ------ GUI Defintion ------ # # ------ GUI Defintion ------ #
layout = [ layout = [
[sg.Menu(menu_def, tearoff=False, pad=(20, 1))], [sg.Menu(menu_def, tearoff=False, pad=(200, 1))],
[sg.Text('Right click me for a right click menu example')],
[sg.Output(size=(60, 20))], [sg.Output(size=(60, 20))],
[sg.ButtonMenu('ButtonMenu', right_click_menu, key='-BMENU-'), sg.Button('Plain Button')],
] ]
window = sg.Window("Windows-like program", window = sg.Window("Windows-like program",
layout, layout,
default_element_size=(12, 1), default_element_size=(12, 1),
auto_size_text=False, default_button_element_size=(12, 1),
auto_size_buttons=False, right_click_menu=right_click_menu)
default_button_element_size=(12, 1))
# ------ Loop & Process button menu choices ------ # # ------ Loop & Process button menu choices ------ #
while True: while True:
event, values = window.read() event, values = window.read()
if event in (None, 'Exit'): if event in (None, 'Exit'):
return break
print('Event = ', event) print(event, values)
# ------ Process menu choices ------ # # ------ Process menu choices ------ #
if event == 'About...': if event == 'About...':
window.disappear() window.disappear()
sg.popup('About this program', 'Version 1.0', sg.popup('About this program', 'Version 1.0',
'PySimpleGUI rocks...', grab_anywhere=True) 'PySimpleGUI Version', sg.version, grab_anywhere=True)
window.reappear() window.reappear()
elif event == 'Open': elif event == 'Open':
filename = sg.popup_get_file('file to open', no_window=True) filename = sg.popup_get_file('file to open', no_window=True)

View File

@ -5,13 +5,13 @@ import PySimpleGUI as sg
Demonstration of how to work with multiple colors when outputting text to a multiline element Demonstration of how to work with multiple colors when outputting text to a multiline element
""" """
sg.change_look_and_feel('Dark Blue 3') sg.theme('Dark Blue 3')
MLINE_KEY = '-MLINE-'+sg.WRITE_ONLY_KEY MLINE_KEY = '-MLINE-'+sg.WRITE_ONLY_KEY
layout = [ [sg.Text('Demonstration of Multiline Element\'s ability to show multiple colors ')], layout = [ [sg.Text('Demonstration of Multiline Element\'s ability to show multiple colors ')],
[sg.Multiline(size=(60,20), key=MLINE_KEY)], [sg.Multiline(size=(60,20), key=MLINE_KEY)],
[sg.B('Plain'), sg.Button('Text Blue Line'), sg.Button('Text Green Line'),sg.Button('Background Blue Line'),sg.Button('Background Green Line'), sg.B('White on Green') [sg.B('Plain'), sg.Button('Text Blue Line'), sg.Button('Text Green Line')],
] ] [sg.Button('Background Blue Line'),sg.Button('Background Green Line'), sg.B('White on Green')] ]
window = sg.Window('Demonstration of Multicolored Multline Text', layout) window = sg.Window('Demonstration of Multicolored Multline Text', layout)

View File

@ -50,7 +50,7 @@ def the_gui():
""" """
global thread_done, message, progress global thread_done, message, progress
sg.change_look_and_feel('Light Brown 3') sg.theme('Light Brown 3')
layout = [[sg.Text('Long task to perform example')], layout = [[sg.Text('Long task to perform example')],
[sg.Output(size=(80, 12))], [sg.Output(size=(80, 12))],

View File

@ -43,7 +43,7 @@ def the_gui():
Reads data from a Queue and displays the data to the window Reads data from a Queue and displays the data to the window
Returns when the user exits / closes the window Returns when the user exits / closes the window
""" """
sg.theme('Light Brown 3')
gui_queue = queue.Queue() # queue used to communicate between the gui and the threads gui_queue = queue.Queue() # queue used to communicate between the gui and the threads
layout = [[sg.Text('Long task to perform example')], layout = [[sg.Text('Long task to perform example')],

View File

@ -54,7 +54,7 @@ def long_function_wrapper(work_id, gui_queue):
############################# Begin GUI code ############################# ############################# Begin GUI code #############################
def the_gui(): def the_gui():
sg.change_look_and_feel('Light Brown 3') sg.theme('Light Brown 3')
# queue used to communicate between the gui and long-running code # queue used to communicate between the gui and long-running code
gui_queue = queue.Queue() gui_queue = queue.Queue()

View File

@ -26,7 +26,7 @@ def ShowMeTheButtons():
bcolor = ('black', 'black') bcolor = ('black', 'black')
wcolor = ('white', 'black') wcolor = ('white', 'black')
sg.change_look_and_feel('Black') sg.theme('Black')
sg.set_options(auto_size_buttons=True, border_width=0, sg.set_options(auto_size_buttons=True, border_width=0,
button_color=sg.COLOR_SYSTEM_DEFAULT) button_color=sg.COLOR_SYSTEM_DEFAULT)

View File

@ -9,7 +9,7 @@ import time
# Free online encoder - https://www.base64-image.de/ # Free online encoder - https://www.base64-image.de/
red_x = "R0lGODlhEAAQAPeQAIsAAI0AAI4AAI8AAJIAAJUAAJQCApkAAJoAAJ4AAJkJCaAAAKYAAKcAAKcCAKcDA6cGAKgAAKsAAKsCAKwAAK0AAK8AAK4CAK8DAqUJAKULAKwLALAAALEAALIAALMAALMDALQAALUAALYAALcEALoAALsAALsCALwAAL8AALkJAL4NAL8NAKoTAKwbAbEQALMVAL0QAL0RAKsREaodHbkQELMsALg2ALk3ALs+ALE2FbgpKbA1Nbc1Nb44N8AAAMIWAMsvAMUgDMcxAKVABb9NBbVJErFYEq1iMrtoMr5kP8BKAMFLAMxKANBBANFCANJFANFEB9JKAMFcANFZANZcANpfAMJUEMZVEc5hAM5pAMluBdRsANR8AM9YOrdERMpIQs1UVMR5WNt8X8VgYMdlZcxtYtx4YNF/btp9eraNf9qXXNCCZsyLeNSLd8SSecySf82kd9qqc9uBgdyBgd+EhN6JgtSIiNuJieGHhOGLg+GKhOKamty1ste4sNO+ueenp+inp+HHrebGrefKuOPTzejWzera1O7b1vLb2/bl4vTu7fbw7ffx7vnz8f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAJAALAAAAAAQABAAAAjUACEJHEiwYEEABniQKfNFgQCDkATQwAMokEU+PQgUFDAjjR09e/LUmUNnh8aBCcCgUeRmzBkzie6EeQBAoAAMXuA8ciRGCaJHfXzUMCAQgYooWN48anTokR8dQk4sELggBhQrU9Q8evSHiJQgLCIIfMDCSZUjhbYuQkLFCRAMAiOQGGLE0CNBcZYmaRIDLqQFGF60eTRoSxc5jwjhACFWIAgMLtgUocJFy5orL0IQRHAiQgsbRZYswbEhBIiCCH6EiJAhAwQMKU5DjHCi9gnZEHMTDAgAOw==" red_x = "R0lGODlhEAAQAPeQAIsAAI0AAI4AAI8AAJIAAJUAAJQCApkAAJoAAJ4AAJkJCaAAAKYAAKcAAKcCAKcDA6cGAKgAAKsAAKsCAKwAAK0AAK8AAK4CAK8DAqUJAKULAKwLALAAALEAALIAALMAALMDALQAALUAALYAALcEALoAALsAALsCALwAAL8AALkJAL4NAL8NAKoTAKwbAbEQALMVAL0QAL0RAKsREaodHbkQELMsALg2ALk3ALs+ALE2FbgpKbA1Nbc1Nb44N8AAAMIWAMsvAMUgDMcxAKVABb9NBbVJErFYEq1iMrtoMr5kP8BKAMFLAMxKANBBANFCANJFANFEB9JKAMFcANFZANZcANpfAMJUEMZVEc5hAM5pAMluBdRsANR8AM9YOrdERMpIQs1UVMR5WNt8X8VgYMdlZcxtYtx4YNF/btp9eraNf9qXXNCCZsyLeNSLd8SSecySf82kd9qqc9uBgdyBgd+EhN6JgtSIiNuJieGHhOGLg+GKhOKamty1ste4sNO+ueenp+inp+HHrebGrefKuOPTzejWzera1O7b1vLb2/bl4vTu7fbw7ffx7vnz8f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAJAALAAAAAAQABAAAAjUACEJHEiwYEEABniQKfNFgQCDkATQwAMokEU+PQgUFDAjjR09e/LUmUNnh8aBCcCgUeRmzBkzie6EeQBAoAAMXuA8ciRGCaJHfXzUMCAQgYooWN48anTokR8dQk4sELggBhQrU9Q8evSHiJQgLCIIfMDCSZUjhbYuQkLFCRAMAiOQGGLE0CNBcZYmaRIDLqQFGF60eTRoSxc5jwjhACFWIAgMLtgUocJFy5orL0IQRHAiQgsbRZYswbEhBIiCCH6EiJAhAwQMKU5DjHCi9gnZEHMTDAgAOw=="
sg.change_look_and_feel('Topanga') sg.theme('Topanga')
sg.set_options(border_width=0, margins=(0, 0)) sg.set_options(border_width=0, margins=(0, 0))
layout = [[sg.Text('Notification'+' '*14), layout = [[sg.Text('Notification'+' '*14),

View File

@ -24,7 +24,7 @@ def main():
num_frames = vidFile.get(cv.CAP_PROP_FRAME_COUNT) num_frames = vidFile.get(cv.CAP_PROP_FRAME_COUNT)
fps = vidFile.get(cv.CAP_PROP_FPS) fps = vidFile.get(cv.CAP_PROP_FPS)
sg.change_look_and_feel('Black') sg.theme('Black')
# ---===--- define the window layout --- # # ---===--- define the window layout --- #
layout = [[sg.Text('OpenCV Demo', size=(15, 1), font='Helvetica 20')], layout = [[sg.Text('OpenCV Demo', size=(15, 1), font='Helvetica 20')],

View File

@ -1,4 +1,4 @@
import cv2, PySimpleGUI as sg import cv2, PySimpleGUIWeb as sg
window, cap = sg.Window('Demo Application - OpenCV Integration', [[sg.Image(filename='', key='image')], ], location=(800, 400)), cv2.VideoCapture(0) window, cap = sg.Window('Demo Application - OpenCV Integration', [[sg.Image(filename='', key='image')], ], location=(800, 400)), cv2.VideoCapture(0)
while window(timeout=20)[0] is not None: while window(timeout=20)[0] is not None:
window['image'](data=cv2.imencode('.png', cap.read()[1])[1].tobytes()) window['image'](data=cv2.imencode('.png', cap.read()[1])[1].tobytes())

View File

@ -1,13 +1,14 @@
import cv2, PySimpleGUI as sg import cv2, PySimpleGUI as sg
window = sg.Window('Demo Application - OpenCV Integration', [[sg.Image(filename='', key='image')],], location=(800,400))
cap = cv2.VideoCapture(0) # Setup the camera as a capture device window = sg.Window('Demo Application - OpenCV Integration', [[sg.Image(filename='', key='image')], ], location=(800, 400))
while True: # The PSG "Event Loop" cap = cv2.VideoCapture(0) # Setup the camera as a capture device
event, values = window.read(timeout=20, timeout_key='timeout') # get events for the window with 20ms max wait while True: # The PSG "Event Loop"
if event is None: break # if user closed window, quit event, values = window.read(timeout=20, timeout_key='timeout') # get events for the window with 20ms max wait
window['image'].update(data=cv2.imencode('.png', cap.read()[1])[1].tobytes()) # Update image in window if event is None: break # if user closed window, quit
window['image'].update(data=cv2.imencode('.png', cap.read()[1])[1].tobytes()) # Update image in window
""" """
Putting the comment at the bottom so that you can see that the code is indeed 7 lines long. And, there is nothing Putting the comment at the bottom so that you can see that the code is indeed 7 lines long. And, there is nothing
done out of the ordinary to make it 7 lines long. There are no ; for example. OK, so the if statement is on one line done out of the ordinary to make it 7 lines long. There are no ; for example. OK, so the if statement is on one line
but that's the only place that you would traditionally see one more line. So, call it 8 if you want. but that's the only place that you would traditionally see one more line. So, call it 8 if you want.
""" """

View File

@ -18,7 +18,7 @@ enhance: applies local contrast enhancement on the luma channel to make the i
def main(): def main():
sg.change_look_and_feel('LightGreen') sg.theme('LightGreen')
# define the window layout # define the window layout
layout = [ layout = [

View File

@ -10,7 +10,7 @@ Demo program that displays a webcam using OpenCV
def main(): def main():
sg.change_look_and_feel('Black') sg.theme('Black')
# define the window layout # define the window layout
layout = [[sg.Text('OpenCV Demo', size=(40, 1), justification='center', font='Helvetica 20')], layout = [[sg.Text('OpenCV Demo', size=(40, 1), justification='center', font='Helvetica 20')],

View File

@ -28,7 +28,7 @@ USING_QT = False
chars = np.asarray(list(' .,:;irsXA253hMHGS#9B&@')) chars = np.asarray(list(' .,:;irsXA253hMHGS#9B&@'))
SC, GCF, WCF = .1, 1, 7/4 SC, GCF, WCF = .1, 1, 7/4
sg.change_look_and_feel('Black') # make it look cool sg.theme('Black') # make it look cool
# define the window layout # define the window layout
# number of lines of text elements. Depends on cameras image size and the variable SC (scaller) # number of lines of text elements. Depends on cameras image size and the variable SC (scaller)

View File

@ -8,7 +8,7 @@ import cv2
in PySimpleGUIQt (yet). in PySimpleGUIQt (yet).
""" """
sg.change_look_and_feel('Black') sg.theme('Black')
# define the window layout # define the window layout
layout = [[sg.Image(filename='', key='-IMAGE-', tooltip='Right click for exit menu')],] layout = [[sg.Image(filename='', key='-IMAGE-', tooltip='Right click for exit menu')],]

View File

@ -37,7 +37,7 @@ import fitz
import PySimpleGUI as sg import PySimpleGUI as sg
from sys import exit from sys import exit
sg.change_look_and_feel('GreenTan') sg.theme('GreenTan')
if len(sys.argv) == 1: if len(sys.argv) == 1:
fname = sg.popup_get_file( fname = sg.popup_get_file(

View File

@ -1,6 +1,6 @@
import PySimpleGUI as sg import PySimpleGUI as sg
sg.change_look_and_feel('GreenTan') sg.theme('GreenTan')
col1 = sg.Col([[sg.Text('in pane1', text_color='blue')], col1 = sg.Col([[sg.Text('in pane1', text_color='blue')],
[sg.Text('Pane1')], [sg.Text('Pane1')],

View File

@ -59,14 +59,15 @@ def main():
login_password_hash = '6adfb183a4a2c94a2f92dab5ade762a47889a5a1' # helloworld login_password_hash = '6adfb183a4a2c94a2f92dab5ade762a47889a5a1' # helloworld
password = sg.popup_get_text( password = sg.popup_get_text(
'Password: (type gui for other window)', password_char='*') 'Password: (type gui for other window)', password_char='*')
if password and password == 'gui': # Remove when pasting into your program if password == 'gui': # Remove when pasting into your program
HashGeneratorGUI() # Remove when pasting into your program HashGeneratorGUI() # Remove when pasting into your program
return # Remove when pasting into your program return # Remove when pasting into your program
if PasswordMatches(password, login_password_hash): if password and PasswordMatches(password, login_password_hash):
print('Login SUCCESSFUL') print('Login SUCCESSFUL')
else: else:
print('Login FAILED!!') print('Login FAILED!!')
if __name__ == '__main__': if __name__ == '__main__':
sg.theme('DarkAmber')
main() main()

View File

@ -2,6 +2,7 @@
import PySimpleGUI as sg import PySimpleGUI as sg
from time import sleep from time import sleep
sg.theme('Dark Blue 3')
""" """
Demonstration of simple and multiple one_line_progress_meter's as well as the Progress Meter Element Demonstration of simple and multiple one_line_progress_meter's as well as the Progress Meter Element

View File

@ -21,7 +21,8 @@ graph = window['-GRAPH-']
# -------------- Magic code to integrate PyGame with tkinter ------- # -------------- Magic code to integrate PyGame with tkinter -------
embed = graph.TKCanvas embed = graph.TKCanvas
os.environ['SDL_WINDOWID'] = str(embed.winfo_id()) os.environ['SDL_WINDOWID'] = str(embed.winfo_id())
os.environ['SDL_VIDEODRIVER'] = 'windib' # change this to 'x11' to make it work on Linux # change this to 'x11' to make it work on Linux
os.environ['SDL_VIDEODRIVER'] = 'windib'
# ----------------------------- PyGame Code ----------------------------- # ----------------------------- PyGame Code -----------------------------

View File

@ -44,7 +44,7 @@ def draw_figure(canvas, figure, loc=(0, 0)):
return figure_canvas_agg return figure_canvas_agg
# ------------------------------- Beginning of GUI CODE ------------------------------- # ------------------------------- Beginning of GUI CODE -------------------------------
sg.change_look_and_feel('Light Brown 3') sg.theme('Light Brown 3')
fig = plt.gcf() # if using Pyplot then get the figure from the plot fig = plt.gcf() # if using Pyplot then get the figure from the plot
figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds

View File

@ -43,7 +43,7 @@ def draw_figure(canvas, figure, loc=(0, 0)):
# ------------------------------- Beginning of GUI CODE ------------------------------- # ------------------------------- Beginning of GUI CODE -------------------------------
sg.change_look_and_feel('Light Brown 3') sg.theme('Light Brown 3')
fig = plt.gcf() # if using Pyplot then get the figure from the plot fig = plt.gcf() # if using Pyplot then get the figure from the plot
figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds

View File

@ -41,7 +41,7 @@ def execute_command_nonblocking(command, *args):
def Launcher2(): def Launcher2():
sg.change_look_and_feel('GreenTan') sg.theme('GreenTan')
filelist = glob.glob(LOCATION_OF_YOUR_SCRIPTS+'*.py') filelist = glob.glob(LOCATION_OF_YOUR_SCRIPTS+'*.py')
namesonly = [] namesonly = []

View File

@ -123,5 +123,5 @@ def runCommand(cmd, timeout=None, window=None):
return retval return retval
sg.change_look_and_feel('Dark Blue 3') sg.theme('Dark Blue 3')
main() main()

View File

@ -8,11 +8,13 @@ import PySimpleGUI as sg
be displayed in realtime in the window. be displayed in realtime in the window.
""" """
sg.theme('Dark Blue 3')
def main(): def main():
layout = [ [sg.Text('Enter the command you wish to run')], layout = [
[sg.Input(key='-IN-')], [sg.Output(size=(110,30), background_color='black', text_color='white')],
[sg.Output(size=(60,15))], [sg.T('Promt> '), sg.Input(key='-IN-', do_not_clear=False)],
[sg.Button('Run'), sg.Button('Exit')] ] [sg.Button('Run', bind_return_key=True), sg.Button('Exit')] ]
window = sg.Window('Realtime Shell Command Output', layout) window = sg.Window('Realtime Shell Command Output', layout)
@ -27,6 +29,7 @@ def main():
def runCommand(cmd, timeout=None, window=None): def runCommand(cmd, timeout=None, window=None):
nop = None
""" run shell command """ run shell command
@param cmd: command to execute @param cmd: command to execute
@param timeout: timeout for command execution @param timeout: timeout for command execution
@ -39,7 +42,7 @@ def runCommand(cmd, timeout=None, window=None):
line = line.decode(errors='replace' if (sys.version_info) < (3, 5) else 'backslashreplace').rstrip() line = line.decode(errors='replace' if (sys.version_info) < (3, 5) else 'backslashreplace').rstrip()
output += line output += line
print(line) print(line)
window.refresh() if window else None # yes, a 1-line if, so shoot me window.refresh() if window else nop # yes, a 1-line if, so shoot me
retval = p.wait(timeout) retval = p.wait(timeout)
return (retval, output) return (retval, output)

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
import PySimpleGUI as sg import PySimpleGUI as sg
import sys
''' '''
Quickly add a GUI to your script! Quickly add a GUI to your script!
@ -13,6 +13,7 @@ The 1-line-GUI shows a form that allows the user to browse to find the filename.
stores the result in the variable fname, just like the command line parsing did. stores the result in the variable fname, just like the command line parsing did.
''' '''
fname = ''
if len(sys.argv) == 1: if len(sys.argv) == 1:
layout = [ layout = [
[sg.Text('Document to open')], [sg.Text('Document to open')],
@ -22,6 +23,7 @@ if len(sys.argv) == 1:
window = sg.Window('My Script', layout) window = sg.Window('My Script', layout)
event, values = window.read() event, values = window.read()
window.close() window.close()
fname = values['-FNAME-']
else: else:
fname = sys.argv[1] fname = sys.argv[1]
if not fname: if not fname:

View File

@ -30,7 +30,7 @@ def draw_bars(graph, items):
def main(): def main():
sg.change_look_and_feel('LightGreen') sg.theme('LightGreen')
# Make list to sort # Make list to sort
num_bars = DATA_SIZE[0]//(BAR_WIDTH+1) num_bars = DATA_SIZE[0]//(BAR_WIDTH+1)
list_to_sort = [DATA_SIZE[1]//num_bars*i for i in range(1, num_bars)] list_to_sort = [DATA_SIZE[1]//num_bars*i for i in range(1, num_bars)]

View File

@ -6,7 +6,7 @@ import PySimpleGUI as sg
""" """
sg.set_options(element_padding=(0, 0)) sg.set_options(element_padding=(0, 0))
# sg.change_look_and_feel('Dark') # sg.theme('Dark')
# --- Define our "Big-Button-Spinner" compound element. Has 2 buttons and an input field --- # # --- Define our "Big-Button-Spinner" compound element. Has 2 buttons and an input field --- #
NewSpinner = [sg.Button('-', size=(2, 1), font='Any 12'), NewSpinner = [sg.Button('-', size=(2, 1), font='Any 12'),
sg.Input('0', size=(2, 1), font='Any 14', sg.Input('0', size=(2, 1), font='Any 14',

View File

@ -3,6 +3,7 @@ import PySimpleGUI as sg
import csv import csv
# Show CSV data in Table # Show CSV data in Table
sg.theme('Dark Red')
def table_example(): def table_example():
filename = sg.popup_get_file('filename to open', no_window=True, file_types=(("CSV Files","*.csv"),)) filename = sg.popup_get_file('filename to open', no_window=True, file_types=(("CSV Files","*.csv"),))
@ -31,7 +32,7 @@ def table_example():
max_col_width=25, max_col_width=25,
auto_size_columns=True, auto_size_columns=True,
justification='right', justification='right',
alternating_row_color='lightblue', # alternating_row_color='lightblue',
num_rows=min(len(data), 20))]] num_rows=min(len(data), 20))]]

View File

@ -3,40 +3,48 @@ import PySimpleGUI as sg
import random import random
import string import string
# Yet another example of showing CSV data in Table """
Basic use of the Table Element
"""
sg.theme('Dark Red')
# ------ Some functions to help generate data for the table ------
def word(): def word():
return ''.join(random.choice(string.ascii_lowercase) for i in range(10)) return ''.join(random.choice(string.ascii_lowercase) for i in range(10))
def number(max_val=1000): def number(max_val=1000):
return random.randint(0, max_val) return random.randint(0, max_val)
def make_table(num_rows, num_cols): def make_table(num_rows, num_cols):
data = [[j for j in range(num_cols)] for i in range(num_rows)] data = [[j for j in range(num_cols)] for i in range(num_rows)]
data[0] = [word() for _ in range(num_cols)] data[0] = [word() for __ in range(num_cols)]
for i in range(1, num_rows): for i in range(1, num_rows):
data[i] = [word(), *[number() for i in range(num_cols - 1)]] data[i] = [word(), *[number() for i in range(num_cols - 1)]]
return data return data
# ------ Make the Table Data ------
data = make_table(num_rows=15, num_cols=6) data = make_table(num_rows=15, num_cols=6)
# sg.set_options(element_padding=(0,0)) headings = [str(data[0][x]) for x in range(len(data[0]))]
headings = [data[0][x] for x in range(len(data[0]))]
layout = [[sg.Table(values=data[1:][:], headings=headings, max_col_width=25, background_color='lightblue', # ------ Window Layout ------
layout = [[sg.Table(values=data[1:][:], headings=headings, max_col_width=25,
# background_color='light blue',
auto_size_columns=True, auto_size_columns=True,
display_row_numbers=True, display_row_numbers=True,
justification='right', justification='right',
num_rows=20, num_rows=20,
alternating_row_color='blue', # alternating_row_color='lightyellow',
key='-table-', key='-TABLE-',
tooltip='This is a table')], tooltip='This is a table')],
[sg.Button('Read'), sg.Button('Double'), sg.Button('Update')], [sg.Button('Read'), sg.Button('Double'), sg.Button('Change Colors')],
[sg.Text('Read = read which rows are selected')], [sg.Text('Double = double the amount of data in the table')]] [sg.Text('Read = read which rows are selected')],
[sg.Text('Double = double the amount of data in the table')],
[sg.Text('Change Colors = Changes the colors of rows 8 and 9')]]
window = sg.Window('Table', layout, grab_anywhere=False, resizable=True) # ------ Create Window ------
window = sg.Window('The Table Element', layout)
# ------ Event Loop ------
while True: while True:
event, values = window.read() event, values = window.read()
print(event, values) print(event, values)
@ -45,9 +53,8 @@ while True:
if event == 'Double': if event == 'Double':
for i in range(len(data)): for i in range(len(data)):
data.append(data[i]) data.append(data[i])
window['-table-'].update(values=data) window['-TABLE-'].update(values=data)
elif event == 'Update': elif event == 'Change Colors':
window['-table-'].update(row_colors=((8, 'white', window['-TABLE-'].update(row_colors=((8, 'white', 'red'), (9, 'green')))
'red'), (9, 'black')))
window.close() window.close()

View File

@ -13,14 +13,12 @@ def TableSimulation():
['Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ], ['Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ],
['Help', 'About...'], ] ['Help', 'About...'], ]
columm_layout = [[]]
MAX_ROWS = 20 MAX_ROWS = 20
MAX_COL = 10 MAX_COL = 10
for i in range(MAX_ROWS):
inputs = [sg.Text(str(i), size=(4, 1), justification='right')] + [sg.Input(size=(10, 1), pad=( columm_layout = [[sg.Text(str(i), size=(4, 1), justification='right')] + [sg.Input(size=(10, 1), pad=(
1, 1), justification='right', key=(i, j)) for j in range(MAX_COL)] 1, 1), justification='right', key=(i, j)) for j in range(MAX_COL)] for i in range(MAX_ROWS)]
columm_layout.append(inputs)
layout = [[sg.Menu(menu_def)], layout = [[sg.Menu(menu_def)],
[sg.Text('Table Using Combos and Input Elements', font='Any 18')], [sg.Text('Table Using Combos and Input Elements', font='Any 18')],

View File

@ -7,7 +7,7 @@ import operator
the arrow keys. The tab key works automatically, but the arrow keys are done in the code below. the arrow keys. The tab key works automatically, but the arrow keys are done in the code below.
""" """
sg.change_look_and_feel('Dark Brown 2') # No excuse for gray windows sg.theme('Dark Brown 2') # No excuse for gray windows
# Show a "splash" type message so the user doesn't give up waiting # Show a "splash" type message so the user doesn't give up waiting
sg.popup_quick_message('Hang on for a moment, this will take a bit to create....', auto_close=True, non_blocking=True) sg.popup_quick_message('Hang on for a moment, this will take a bit to create....', auto_close=True, non_blocking=True)
@ -63,4 +63,4 @@ while True: # Event Loop
# if clicked button to dump the table's values # if clicked button to dump the table's values
if event.startswith('Show Table'): if event.startswith('Show Table'):
table = [[values[(row, col)] for col in range(MAX_COLS)] for row in range(MAX_ROWS)] table = [[values[(row, col)] for col in range(MAX_COLS)] for row in range(MAX_ROWS)]
sg.popup_scrolled('your_table = [ ', ',\n'.join([str(table[i]) for i in range(MAX_ROWS)]) + ' ]', title='Copy your data from here') sg.popup_scrolled('your_table = [ ', ',\n'.join([str(table[i]) for i in range(MAX_ROWS)]) + ' ]', title='Copy your data from here', font='fixedsys', keep_on_top=True)

View File

@ -3,10 +3,12 @@ import sys
import PySimpleGUI as sg import PySimpleGUI as sg
# Usage of Tabs in PSG # Usage of Tabs in PSG
#
# sg.set_options(background_color='cornsilk4',
# element_background_color='cornsilk2',
# input_elements_background_color='cornsilk2')
sg.set_options(background_color='cornsilk4', sg.theme('Light Green 5')
element_background_color='cornsilk2',
input_elements_background_color='cornsilk2')
tab1_layout = [[sg.Text('This is inside tab 1', background_color='darkslateblue', text_color='white')], tab1_layout = [[sg.Text('This is inside tab 1', background_color='darkslateblue', text_color='white')],
[sg.Input(key='-in0-')]] [sg.Input(key='-in0-')]]

View File

@ -3,7 +3,7 @@ import PySimpleGUI as sg
# Yet another example of TabGroup element # Yet another example of TabGroup element
sg.change_look_and_feel('GreenTan') sg.theme('GreenTan')
tab2_layout = [[sg.Text('This is inside tab 2')], tab2_layout = [[sg.Text('This is inside tab 2')],
[sg.Text('Tabs can be anywhere now!')]] [sg.Text('Tabs can be anywhere now!')]]

View File

@ -1,40 +1,48 @@
#!/usr/bin/env python #!/usr/bin/env python
import PySimpleGUI as sg import PySimpleGUI as sg
# Simple example of TabGroup element and the options available to it
# Simple example of TabGroup element sg.theme('Dark Red') # Please always add color to your window
sg.change_look_and_feel('Dark Brown 1')
# The tab 1, 2, 3 layouts - what goes inside the tab
tab1_layout = [[sg.Text('Tab 1')], tab1_layout = [[sg.Text('Tab 1')],
[sg.Text('Put your layout in here')], [sg.Text('Put your layout in here')],
[sg.Text('Input something'), sg.Input(size=(12,1), key='-IN0-')]] [sg.Text('Input something'), sg.Input(size=(12,1), key='-IN-TAB1-')]]
tab2_layout = [[sg.Text('Tab 2')]] tab2_layout = [[sg.Text('Tab 2')]]
tab3_layout = [[sg.Text('Tab 3')]] tab3_layout = [[sg.Text('Tab 3')]]
tab4_layout = [[sg.Text('Tab 3')]]
# The TabgGroup layout - it must contain only Tabs
tab_group_layout = [[sg.Tab('Tab 1', tab1_layout, key='-TAB1-'), tab_group_layout = [[sg.Tab('Tab 1', tab1_layout, font='Courier 15', key='-TAB1-'),
sg.Tab('Tab 2', tab2_layout, visible=False, key='-TAB2-'), sg.Tab('Tab 2', tab2_layout, visible=False, key='-TAB2-'),
sg.Tab('Tab 3', tab3_layout, key='-TAB3-')]] sg.Tab('Tab 3', tab3_layout, key='-TAB3-'),
sg.Tab('Tab 4', tab3_layout, visible=False, key='-TAB4-'),
]]
# The window layout - defines the entire window
layout = [[sg.TabGroup(tab_group_layout, layout = [[sg.TabGroup(tab_group_layout,
selected_title_color='blue', # selected_title_color='blue',
selected_background_color='red', # selected_background_color='red',
tab_background_color='green', # tab_background_color='green',
enable_events=True, enable_events=True,
# font='Courier 18',
key='-TABGROUP-')], key='-TABGROUP-')],
[sg.Text('Make tab number'), sg.Input(key='-IN-', size=(3,1)), sg.Button('Invisible'), sg.Button('Visible')]] [sg.Text('Make tab number'), sg.Input(key='-IN-', size=(3,1)), sg.Button('Invisible'), sg.Button('Visible')]]
window = sg.Window('My window with tabs', layout) window = sg.Window('My window with tabs', layout, no_titlebar=False)
tab_keys = ('-TAB1-','-TAB2-','-TAB3-') tab_keys = ('-TAB1-','-TAB2-','-TAB3-', '-TAB4-') # map from an input value to a key
while True: while True:
event, values = window.read() # type: str, dict event, values = window.read() # type: str, dict
print(event, values) print(event, values)
if event is None: if event is None:
break break
# handle button clicks
if event == 'Invisible': if event == 'Invisible':
window[tab_keys[int(values['-IN-'])-1]].update(visible=False) window[tab_keys[int(values['-IN-'])-1]].update(visible=False)
if event == 'Visible': if event == 'Visible':
window[tab_keys[int(values['-IN-'])-1]].update(visible=True) window[tab_keys[int(values['-IN-'])-1]].update(visible=True)
window.close() window.close()

View File

@ -0,0 +1,27 @@
import PySimpleGUI as sg
"""
Allows you to "browse" through the theme settings. Click on one and you'll see a
Popup window using the color scheme you chose. It's a simply little program that demonstrates
how snappy a GUI can feel if you enable an element's events rather than waiting on a button click.
In this program, as soon as a listbox entry is clicked, the read returns.
"""
sg.theme('Dark Green 5')
layout = [[sg.Text('Look and Feel Browser')],
[sg.Text('Click a look and feel color to see demo window')],
[sg.Listbox(values=sg.theme_list(),
size=(20, 20), key='-LIST-', enable_events=True)],
[sg.Button('Exit')]]
window = sg.Window('Look and Feel Browser', layout)
while True: # Event Loop
event, values = window.read()
if event in (None, 'Exit'):
break
sg.theme(values['-LIST-'][0])
sg.popup_get_text('This is {}'.format(values['-LIST-'][0]), default_text=values['-LIST-'][0])
window.close()

View File

@ -0,0 +1,42 @@
import PySimpleGUI as sg
# import PySimpleGUIWeb as sg
# import PySimpleGUIQt as sg
"""
If you're using the PySimpleGUI color themes, then your code will a line that looks something like this:
sg.theme('Light Green 1') or sg.theme('LightGreen1')
This demo shows how to access the list of all themes to build your own previewer
"""
# Use the built-in Theme Viewer to show all of the themes and their names
# sg.theme_previewer()
# The remainder of the program duplicates the built-in Theme Viewer, allowing you to create your
# own custom theme viewer window. You can configure the number of frames per row for example. Or maybe you only
# want to see the dark themes
window_background = 'black'
def sample_layout():
return [[sg.Text('Text element'), sg.InputText('Input data here', size=(15, 1))],
[sg.Button('Ok'), sg.Button('Cancel'), sg.Slider((1, 10), orientation='h', size=(10, 15))]]
layout = [[sg.Text('List of Dark Themes Provided by PySimpleGUI', font='Default 18', background_color=window_background)]]
FRAMES_PER_ROW = 9
names = sg.theme_list()
names = [name for name in names if 'dark' in name.lower()]
row = []
for count, theme in enumerate(names):
sg.theme(theme)
if not count % FRAMES_PER_ROW:
layout += [row]
row = []
row += [sg.Frame(theme, sample_layout())]
if row:
layout += [row]
window = sg.Window('Custom Preview of Themes', layout, background_color=window_background)
window.read()
window.close()

View File

@ -4,7 +4,7 @@ import time
# Basic timer in PSG # Basic timer in PSG
def Timer(): def Timer():
sg.change_look_and_feel('Dark') sg.theme('Dark')
sg.set_options(element_padding=(0, 0)) sg.set_options(element_padding=(0, 0))
form_rows = [[sg.Text(size=(8, 2), font=('Helvetica', 20), form_rows = [[sg.Text(size=(8, 2), font=('Helvetica', 20),
justification='center', key='text')], justification='center', key='text')],

View File

@ -9,7 +9,7 @@ from random import randint as randint
They're good for a quick status display / dashboard, for use on buttons (arrows), or as "simple clipart" to name a few uses They're good for a quick status display / dashboard, for use on buttons (arrows), or as "simple clipart" to name a few uses
""" """
sg.change_look_and_feel('Light Brown 4') sg.theme('Light Brown 4')
SQUARE = '' SQUARE = ''
CIRCLE = '' CIRCLE = ''
@ -31,7 +31,7 @@ layout = [ [sg.Text('Unicode Characters Demo', font='Def 16')],
[sg.T('Enter a Char'), sg.In(size=(2,1), key='-CHAR-', font='Any 18'), sg.T('Unicode number: '), sg.T(size=(6,1), key='-OUT NUM-')]])], [sg.T('Enter a Char'), sg.In(size=(2,1), key='-CHAR-', font='Any 18'), sg.T('Unicode number: '), sg.T(size=(6,1), key='-OUT NUM-')]])],
[sg.Frame('Display Unicode Characters In Range', [sg.Frame('Display Unicode Characters In Range',
[[sg.T('Starting Number'), sg.In(size=(6, 1), key='-START-'), sg.T('Ending Number char: '), sg.I(size=(6, 1), key='-END-')], [[sg.T('Starting Number'), sg.In(size=(6, 1), key='-START-'), sg.T('Ending Number char: '), sg.I(size=(6, 1), key='-END-')],
[sg.B('Display Chars'), sg.T('Display Font Size'), sg.Spin(list(range(10,25)), initial_value=18, font='Any 14', key='-FONTSIZE-')], [sg.B('Display Chars', bind_return_key=True), sg.T('Display Font Size'), sg.Spin(list(range(10,25)), initial_value=18, font='Any 14', key='-FONTSIZE-')],
])], ])],
[sg.Multiline(size=(30,10), font='Any 18',key='-MLINE-'+sg.WRITE_ONLY_KEY)], [sg.Multiline(size=(30,10), font='Any 18',key='-MLINE-'+sg.WRITE_ONLY_KEY)],
[sg.B(UP), sg.B(DOWN), sg.B(LEFT), sg.B(RIGHT), sg.B('Exit')] ] [sg.B(UP), sg.B(DOWN), sg.B(LEFT), sg.B(RIGHT), sg.B('Exit')] ]
@ -63,7 +63,7 @@ while True:
elif event.startswith('Display'): # process the dump range section elif event.startswith('Display'): # process the dump range section
try: try:
for c in range(int(values['-START-']), int(values['-END-'])): for c in range(int(values['-START-']), int(values['-END-'])):
window['-MLINE-'+sg.WRITE_ONLY_KEY](chr(c), append=True) window['-MLINE-'+sg.WRITE_ONLY_KEY](chr(c), append=True, text_color_for_value='red')
window.refresh() window.refresh()
sg.popup_animated(sg.DEFAULT_BASE64_LOADING_GIF, 'Writing chars to display', text_color='red', font='Any 20', time_between_frames=100) sg.popup_animated(sg.DEFAULT_BASE64_LOADING_GIF, 'Writing chars to display', text_color='red', font='Any 20', time_between_frames=100)
except: pass except: pass

File diff suppressed because one or more lines are too long

View File

@ -13,7 +13,7 @@ youtube_executable = 'path/to/youtube-dl'
def DownloadSubtitlesGUI(): def DownloadSubtitlesGUI():
sg.change_look_and_feel('Dark') sg.theme('Dark')
combobox = sg.Combo(values=['', ], size=(10, 1), key='lang') combobox = sg.Combo(values=['', ], size=(10, 1), key='lang')
layout = [ layout = [

View File

@ -46,7 +46,7 @@ def show_list_by_name(window):
def main(): def main():
# ---------------- Create Form ---------------- # ---------------- Create Form ----------------
# sg.change_look_and_feel('Topanga') # sg.theme('Topanga')
layout = [[sg.Text('Process Killer - Choose one or more processes', layout = [[sg.Text('Process Killer - Choose one or more processes',
size=(45,1), font=('Helvetica', 15), text_color='red')], size=(45,1), font=('Helvetica', 15), text_color='red')],

BIN
DemoPrograms/db.sqlite3 Normal file

Binary file not shown.

View File

@ -1,6 +1,5 @@
# PySimpleGUI Demo Programs # PySimpleGUI Demo Programs
## One Stop Shopping For Templates and Techniques ## One Stop Shopping For Templates and Techniques
This folder of over 170 programs is your jump-start, spring board, boost, shove in the back, cheat sheet to get you to a solution as quickly as possible. You can think of them as Recipes from a large PySimpleGUI Cookbook. This folder of over 170 programs is your jump-start, spring board, boost, shove in the back, cheat sheet to get you to a solution as quickly as possible. You can think of them as Recipes from a large PySimpleGUI Cookbook.