commit
						d21e2a0310
					
				
					 2 changed files with 53 additions and 23 deletions
				
			
		
							
								
								
									
										48
									
								
								DemoPrograms/Demo_Script_Launcher_Realtime_Output.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								DemoPrograms/Demo_Script_Launcher_Realtime_Output.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -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() | ||||
|  | @ -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() | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue