PySimpleGUI/DemoPrograms/Demo_Script_Launcher_Realti...

49 lines
1.4 KiB
Python
Raw Normal View History

2019-04-26 15:32:21 +00:00
import subprocess
import sys
import PySimpleGUI as sg
"""
Demo Program - Realtime output of a shell command in the window
Shows how you can run a long-running subprocess and have the output
be displayed in realtime in the window.
2019-04-26 15:32:21 +00:00
"""
def main():
layout = [ [sg.Text('Enter the command you wish to run')],
[sg.Input(key='-IN-')],
[sg.Output(size=(60,15))],
[sg.Button('Run'), sg.Button('Exit')] ]
2019-04-26 15:32:21 +00:00
window = sg.Window('Realtime Shell Command Output', layout)
2019-04-26 15:32:21 +00:00
while True: # Event Loop
event, values = window.read()
# print(event, values)
if event in (None, 'Exit'):
break
elif event == 'Run':
runCommand(cmd=values['-IN-'], window=window)
window.close()
2019-04-26 15:32:21 +00:00
def runCommand(cmd, timeout=None, window=None):
""" run shell command
2019-04-26 15:32:21 +00:00
@param cmd: command to execute
@param timeout: timeout for command execution
@param window: the PySimpleGUI window that the output is going to (needed to do refresh on)
@return: (return code from command, command output)
"""
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = ''
for line in p.stdout:
line = line.decode(errors='replace' if (sys.version_info) < (3, 5) else 'backslashreplace').rstrip()
output += line
print(line)
window.refresh() if window else None # yes, a 1-line if, so shoot me
retval = p.wait(timeout)
return (retval, output)
2019-04-26 15:32:21 +00:00
main()