diff --git a/DemoPrograms/Demo_Script_Launcher_Realtime_Output.py b/DemoPrograms/Demo_Script_Launcher_Realtime_Output.py new file mode 100644 index 00000000..12b54c6b --- /dev/null +++ b/DemoPrograms/Demo_Script_Launcher_Realtime_Output.py @@ -0,0 +1,48 @@ +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. +""" + +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')] ] + + window = sg.Window('Realtime Shell Command Output', layout) + + 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() + + +def runCommand(cmd, timeout=None, window=None): + """ run shell command + @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) + + +main() diff --git a/PySimpleGUIWeb/PySimpleGUIWeb.py b/PySimpleGUIWeb/PySimpleGUIWeb.py index 8cd4696e..bcdebf99 100644 --- a/PySimpleGUIWeb/PySimpleGUIWeb.py +++ b/PySimpleGUIWeb/PySimpleGUIWeb.py @@ -364,7 +364,7 @@ class Element(): # ------------------------- REMI CHANGED CALLBACK ----------------------- # called when a widget has changed and the element has events enabled def ChangedCallback(self, widget:remi.Widget, *args): - print(f'Callback {args}') + # print(f'Callback {args}') self.ParentForm.LastButtonClicked = self.Key if self.Key is not None else '' self.ParentForm.MessageQueue.put(self.ParentForm.LastButtonClicked) @@ -1834,13 +1834,9 @@ class Graph(Element): return rpoint - def DrawImage(self, image_source=None, location=(None, None), size=(100, 100), color='black', font=None, angle=0): + def DrawImage(self, image_source=None, location=(None, None), size=(100, 100)): if location == (None, None): return - # if type(image_source) is bytes: - # image = base64_to_style_image(image_source) - # else: - # image = "url('{}')".format('/'+image_source) converted_point = self._convert_xy_to_canvas_xy(location[0], location[1]) if self.Widget is None: print('*** WARNING - The Graph element has not been finalized and cannot be drawn upon ***') @@ -1851,28 +1847,15 @@ class Graph(Element): if type(image_source) is bytes or len(image_source) > 200: rpoint.set_image("data:image/svg;base64,%s"%image_source) - # img_string = "data:image/svg+xml;base64,%s"%image_source else: mimetype, encoding = mimetypes.guess_type(image_source) with open(image_source, 'rb') as f: data = f.read() - # rpoint.set_image("data:%s;base64,%s" % (mimetype, base64.b64encode(data))) b64 = base64.b64encode(data) b64_str = b64.decode("utf-8") image_string = "data:image/svg;base64,%s"%b64_str rpoint.set_image(image_string) - # rpoint.set_image("data:image/svg;base64,%s"% base64.b64encode(data)) - # rpoint.set_image(image_source) - # img_string = "data:image/svg+xml;base64,%s"% base64.b64encode(data) self.SvgGroup.append([rpoint,]) - # rpoint.set_image(image_source) - # self.SvgGroup.redraw() - # image_widget.attributes['x'] = converted_point[0] - # image_widget.attributes['y'] = converted_point[1] - # image_widget.style['background-repeat'] = 'no-repeat' - # self.Widget.data = shape - # self.Widget.add_child("image", shape) - # self.Widget.append([shape,]) def Erase(self): if self.Widget is None: @@ -1892,6 +1875,8 @@ class Graph(Element): self.Widget.style['background-color'] = self.BackgroundColor def Move(self, x_direction, y_direction): + # TODO - IT's still not working yet! I'm trying!! + self.MoveFigure(self.SvgGroup, x_direction,y_direction) return zero_converted = self._convert_xy_to_canvas_xy(0, 0) @@ -1919,7 +1904,7 @@ class Graph(Element): def MoveFigure(self, figure, x_direction, y_direction): - figure = figure #type: remi.gui.SvgCircle + figure = figure # type: remi.gui.SvgCircle zero_converted = self._convert_xy_to_canvas_xy(0, 0) shift_converted = self._convert_xy_to_canvas_xy(x_direction, y_direction) shift_amount = (shift_converted[0] - zero_converted[0], shift_converted[1] - zero_converted[1]) @@ -1927,11 +1912,8 @@ class Graph(Element): print('*** WARNING - Your figure is None. It most likely means your did not Finalize your Window ***') print('Call Window.Finalize() prior to all graph operations') return None - # figure.empty() cur_x = float(figure.attributes['x']) cur_y = float(figure.attributes['y']) - print(f'cur_x cur_y = {cur_x}, {cur_y}') - figure.set_position(cur_x - x_direction,cur_y - y_direction) figure.redraw()