From 23c6e89c8bf43fd24de17ce4448e39afa4fd63b2 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy Date: Sun, 21 Apr 2019 16:06:39 -0400 Subject: [PATCH 01/13] Release 0.23.0 PySimpleGUIWeb --- PySimpleGUIWeb/readme.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/PySimpleGUIWeb/readme.md b/PySimpleGUIWeb/readme.md index 6df9a90b..0b0b6603 100644 --- a/PySimpleGUIWeb/readme.md +++ b/PySimpleGUIWeb/readme.md @@ -8,7 +8,7 @@ ![Python Version](https://img.shields.io/badge/Python-3.x-yellow.svg) -![Python Version](https://img.shields.io/badge/PySimpleGUIWeb_-0.22.0-orange.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUIWeb_-0.23.0-orange.svg?longCache=true&style=for-the-badge) @@ -297,6 +297,25 @@ New features * NEW Window parameter layout so can skip calling Layout +## 0.23.0 21-Apr-2019 PySimpleGUIWeb + +* GRAPH ELEMENT almost done! + * DrawLine + * DrawRectangle + * DrawPoint + * DrawCicle + * DrawText + * Erase + * Move + * MoveFigure (by a delta amount) + * RelocateFigure (draw to a new spot) + * Update - for background color change + * Enable events works for single clicks (no drags yet) +* Changed Image element to use SuperImage class + * Image element works better? + * Base64 not yet working + + # Design # Author Mike B. From deb1f0aee171901a008ce8cdd74835a1a5dcb8be Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy Date: Sun, 21 Apr 2019 20:11:53 -0400 Subject: [PATCH 02/13] New RelocateFigure method for Graph Element --- PySimpleGUI.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/PySimpleGUI.py b/PySimpleGUI.py index b2f1d758..3f91222a 100644 --- a/PySimpleGUI.py +++ b/PySimpleGUI.py @@ -1478,7 +1478,7 @@ class Button(Element): self.AutoSizeButton = auto_size_button self.BType = button_type self.FileTypes = file_types - self.TKButton = None + self.TKButton = None # type: tk.Button self.Target = target self.ButtonText = str(button_text) if sys.platform == 'darwin' and button_color is not None: @@ -2013,7 +2013,7 @@ class Graph(Element): self.BottomLeft = graph_bottom_left self.TopRight = graph_top_right self._TKCanvas = None - self._TKCanvas2 = None + self._TKCanvas2 = None # Type: tk.Canvas self.ChangeSubmits = change_submits or enable_events self.DragSubmits = drag_submits self.ClickPosition = (None, None) @@ -2230,6 +2230,19 @@ class Graph(Element): return None self._TKCanvas2.move(figure, shift_amount[0], shift_amount[1]) + + def RelocateFigure(self, figure, x, y): + zero_converted = self._convert_xy_to_canvas_xy(0, 0) + shift_converted = self._convert_xy_to_canvas_xy(x, y) + shift_amount = (shift_converted[0] - zero_converted[0], shift_converted[1] - zero_converted[1]) + if figure is None: + 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 + xy = self._TKCanvas2.coords(figure) + self._TKCanvas2.move(figure, shift_converted[0]-xy[0], shift_converted[1]-xy[1]) + + @property def TKCanvas(self): if self._TKCanvas2 is None: @@ -4994,6 +5007,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): tktext_label.bind('', element.RightClickMenuCallback) # ------------------------- BUTTON element ------------------------- # elif element_type == ELEM_TYPE_BUTTON: + element = element # type: Button stringvar = tk.StringVar() element.TKStringVar = stringvar element.Location = (row_num, col_num) From ca0352589a1c1681c6476fda7bf2c6139396c878 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy Date: Sun, 21 Apr 2019 20:12:37 -0400 Subject: [PATCH 03/13] More graphing primitive work --- PySimpleGUIWeb/PySimpleGUIWeb.py | 94 ++++++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 22 deletions(-) diff --git a/PySimpleGUIWeb/PySimpleGUIWeb.py b/PySimpleGUIWeb/PySimpleGUIWeb.py index 7e7aab66..91936cd6 100644 --- a/PySimpleGUIWeb/PySimpleGUIWeb.py +++ b/PySimpleGUIWeb/PySimpleGUIWeb.py @@ -70,7 +70,7 @@ def TimerStop(): """ # Because looks matter... -DEFAULT_BASE64_ICON = b'iVBORw0KGgoAAAANSUhEUgAAACEAAAAgCAMAAACrZuH4AAAABGdBTUEAALGPC/xhBQAAAwBQTFRFAAAAMGmYMGqZMWqaMmubMmycM22dNGuZNm2bNm6bNG2dN26cNG6dNG6eNW+fN3CfOHCeOXGfNXCgNnGhN3KiOHOjOXSjOHSkOnWmOnamOnanPHSiPXakPnalO3eoPnimO3ioPHioPHmpPHmqPXqqPnurPnusPnytP3yuQHimQnurQn2sQH2uQX6uQH6vR32qRn+sSXujSHynTH2mTn+nSX6pQH6wTIGsTYKuTYSvQoCxQoCyRIK0R4S1RYS2Roa4SIe4SIe6SIi7Soq7SYm8SYq8Sou+TY2/UYStUYWvVIWtUYeyVoewUIi0VIizUI6+Vo+8WImxXJG5YI2xZI+xZ5CzZJC0ZpG1b5a3apW4aZm/cZi4dJ2/eJ69fJ+9XZfEZZnCZJzHaZ/Jdp/AeKTI/tM8/9Q7/9Q8/9Q9/9Q+/tQ//9VA/9ZA/9ZB/9ZC/9dD/9ZE/tdJ/9dK/9hF/9hG/9hH/9hI/9hJ/9hK/9lL/9pK/9pL/thO/9pM/9pN/9tO/9tP/9xP/tpR/9xQ/9xR/9xS/9xT/91U/91V/t1W/95W/95X/95Y/95Z/99a/99b/txf/txh/txk/t5l/t1q/t5v/+Bb/+Bc/+Bd/+Be/+Bf/+Bg/+Fh/+Fi/+Jh/+Ji/uJk/uJl/+Jm/+Rm/uJo/+Ro/+Rr/+Zr/+Vs/+Vu/+Zs/+Zu/uF0/uVw/+dw/+dz/+d2/uB5/uB6/uJ9/uR7/uR+/uV//+hx/+hy/+h0/+h2/+l4/+l7/+h8gKXDg6vLgazOhKzMiqrEj6/KhK/Qka/Hk7HJlLHJlLPMmLTLmbbOkLXSmLvXn77XoLrPpr/Tn8DaocLdpcHYrcjdssfZus/g/uOC/uOH/uaB/uWE/uaF/uWK/+qA/uqH/uqI/uuN/uyM/ueS/ueW/ueY/umQ/uqQ/uuS/uuW/uyU/uyX/uqa/uue/uye/uyf/u6f/uyq/u+r/u+t/vCm/vCp/vCu/vCy/vC2/vK2/vO8/vO/wtTjwtXlzdrl/vTA/vPQAAAAiNpY5gAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAAAJcEhZcwAAFw8AABcPASe7rwsAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjEuMWMqnEsAAAKUSURBVDhPhdB3WE1xHMdxt5JV0dANoUiyd8kqkey996xclUuTlEKidO3qVnTbhIyMW/bee5NskjJLmR/f3++cK/94vP76Ps/n/Zx7z6mE/6koJowcK154vvHOL/GsKCZXkUgkWlf4vWGWq5tsDz+JWIzSokAiqXGe7nWu3HxhEYof7fhOqp1GtptQuMruVhQdxZ05U5G47tYUHbQ4oah6Fg9Z4ubm7i57JhQjdHS0RSzUPoG17u6zZTKZh8c8XlytqW9YWUOH1LqFOZ6enl5ec+XybFb0rweM1tPTM6yuq6vLs0lYJJfLvb19fHwDWGF0jh5lYNAe4/QFemOwxtfXz8/fPyBgwVMqzAcCF4ybAZ2MRCexJGBhYGBQUHDw4u1UHDG1G2ZqB/Q1MTHmzAE+kpCwL1RghlTaBt/6SaXS2kx9YH1IaOjSZST8vfA9JtoDnSngGgL7wkg4WVkofA9mcF1Sx8zMzBK4v3wFiYiMVLxlEy9u21syFhYNmgN7IyJXEYViNZvEYoCVVWOmUVvgQVSUQqGIjolRFvOAFd8HWVs34VoA+6OjY2JjY5Vxm4BC1UuhGG5jY9OUaQXci1MqlfHx8YmqjyhOViW9ZsUN29akJRmPFwkJCZsTSXIpilJffXiTzorLXYgtcxRJKpUqKTklJQ0oSt9FP/EonxVdNY4jla1kK4q2ZB6mIr+AipvduzFUzMSOtLT09IyMzMxtJKug/F0u/6dTexAWDcXXLGEjapKjfsILOLKEuYiSnTQeYCt3UHhbwEHjGMrETfBJU5zq5dSTcXC8hLJccSWP2cgLXHPu7cQNAcpyxF1dyjehAKb0cSYUAOXCUw6V8OFPgevTXFymC+fPPLU677Nw/1X8A/AbfAKGulaqFlIAAAAASUVORK5CYII=' +DEFAULT_BASE64_ICON = 'iVBORw0KGgoAAAANSUhEUgAAACEAAAAgCAMAAACrZuH4AAAABGdBTUEAALGPC/xhBQAAAwBQTFRFAAAAMGmYMGqZMWqaMmubMmycM22dNGuZNm2bNm6bNG2dN26cNG6dNG6eNW+fN3CfOHCeOXGfNXCgNnGhN3KiOHOjOXSjOHSkOnWmOnamOnanPHSiPXakPnalO3eoPnimO3ioPHioPHmpPHmqPXqqPnurPnusPnytP3yuQHimQnurQn2sQH2uQX6uQH6vR32qRn+sSXujSHynTH2mTn+nSX6pQH6wTIGsTYKuTYSvQoCxQoCyRIK0R4S1RYS2Roa4SIe4SIe6SIi7Soq7SYm8SYq8Sou+TY2/UYStUYWvVIWtUYeyVoewUIi0VIizUI6+Vo+8WImxXJG5YI2xZI+xZ5CzZJC0ZpG1b5a3apW4aZm/cZi4dJ2/eJ69fJ+9XZfEZZnCZJzHaZ/Jdp/AeKTI/tM8/9Q7/9Q8/9Q9/9Q+/tQ//9VA/9ZA/9ZB/9ZC/9dD/9ZE/tdJ/9dK/9hF/9hG/9hH/9hI/9hJ/9hK/9lL/9pK/9pL/thO/9pM/9pN/9tO/9tP/9xP/tpR/9xQ/9xR/9xS/9xT/91U/91V/t1W/95W/95X/95Y/95Z/99a/99b/txf/txh/txk/t5l/t1q/t5v/+Bb/+Bc/+Bd/+Be/+Bf/+Bg/+Fh/+Fi/+Jh/+Ji/uJk/uJl/+Jm/+Rm/uJo/+Ro/+Rr/+Zr/+Vs/+Vu/+Zs/+Zu/uF0/uVw/+dw/+dz/+d2/uB5/uB6/uJ9/uR7/uR+/uV//+hx/+hy/+h0/+h2/+l4/+l7/+h8gKXDg6vLgazOhKzMiqrEj6/KhK/Qka/Hk7HJlLHJlLPMmLTLmbbOkLXSmLvXn77XoLrPpr/Tn8DaocLdpcHYrcjdssfZus/g/uOC/uOH/uaB/uWE/uaF/uWK/+qA/uqH/uqI/uuN/uyM/ueS/ueW/ueY/umQ/uqQ/uuS/uuW/uyU/uyX/uqa/uue/uye/uyf/u6f/uyq/u+r/u+t/vCm/vCp/vCu/vCy/vC2/vK2/vO8/vO/wtTjwtXlzdrl/vTA/vPQAAAAiNpY5gAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAAAJcEhZcwAAFw8AABcPASe7rwsAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjEuMWMqnEsAAAKUSURBVDhPhdB3WE1xHMdxt5JV0dANoUiyd8kqkey996xclUuTlEKidO3qVnTbhIyMW/bee5NskjJLmR/f3++cK/94vP76Ps/n/Zx7z6mE/6koJowcK154vvHOL/GsKCZXkUgkWlf4vWGWq5tsDz+JWIzSokAiqXGe7nWu3HxhEYof7fhOqp1GtptQuMruVhQdxZ05U5G47tYUHbQ4oah6Fg9Z4ubm7i57JhQjdHS0RSzUPoG17u6zZTKZh8c8XlytqW9YWUOH1LqFOZ6enl5ec+XybFb0rweM1tPTM6yuq6vLs0lYJJfLvb19fHwDWGF0jh5lYNAe4/QFemOwxtfXz8/fPyBgwVMqzAcCF4ybAZ2MRCexJGBhYGBQUHDw4u1UHDG1G2ZqB/Q1MTHmzAE+kpCwL1RghlTaBt/6SaXS2kx9YH1IaOjSZST8vfA9JtoDnSngGgL7wkg4WVkofA9mcF1Sx8zMzBK4v3wFiYiMVLxlEy9u21syFhYNmgN7IyJXEYViNZvEYoCVVWOmUVvgQVSUQqGIjolRFvOAFd8HWVs34VoA+6OjY2JjY5Vxm4BC1UuhGG5jY9OUaQXci1MqlfHx8YmqjyhOViW9ZsUN29akJRmPFwkJCZsTSXIpilJffXiTzorLXYgtcxRJKpUqKTklJQ0oSt9FP/EonxVdNY4jla1kK4q2ZB6mIr+AipvduzFUzMSOtLT09IyMzMxtJKug/F0u/6dTexAWDcXXLGEjapKjfsILOLKEuYiSnTQeYCt3UHhbwEHjGMrETfBJU5zq5dSTcXC8hLJccSWP2cgLXHPu7cQNAcpyxF1dyjehAKb0cSYUAOXCUw6V8OFPgevTXFymC+fPPLU677Nw/1X8A/AbfAKGulaqFlIAAAAASUVORK5CYII=' # ----====----====----==== Constants the user CAN safely change ====----====----====----# @@ -1663,17 +1663,21 @@ class Image(Element): class SuperImage(remi.gui.Image): def __init__(self, file_path_name=None, **kwargs): - super(SuperImage, self).__init__("/res/logo.png", **kwargs) + image = file_path_name + super(SuperImage, self).__init__(image, **kwargs) self.imagedata = None self.mimetype = None self.encoding = None - self.load(file_path_name) + self.load(image) def load(self, file_path_name): - self.mimetype, self.encoding = mimetypes.guess_type(file_path_name) - with open(file_path_name, 'rb') as f: - self.imagedata = f.read() + if type(file_path_name) is bytes or len(file_path_name) > 200: + self.imagedata = base64.b64decode(file_path_name) + else: + self.mimetype, self.encoding = mimetypes.guess_type(file_path_name) + with open(file_path_name, 'rb') as f: + self.imagedata = f.read() self.refresh() def refresh(self): @@ -1712,6 +1716,7 @@ class Graph(Element): self.MouseButtonDown = False self.Disabled = disabled self.Widget = None # Type: remi.gui.Svg + self.SvgGroup = None # Type: remi.gui.SvgGroup super().__init__(ELEM_TYPE_GRAPH, size=canvas_size, size_px=size_px, visible=visible, background_color=background_color, pad=pad, tooltip=tooltip, key=key) return @@ -1745,7 +1750,7 @@ class Graph(Element): return None line = remi.gui.SvgLine(converted_point_from[0], converted_point_from[1], converted_point_to[0], converted_point_to[1]) line.set_stroke(width, color) - self.Widget.append([line,]) + self.SvgGroup.append([line,]) def DrawPoint(self, point, size=2, color='black'): if point == (None, None): @@ -1755,11 +1760,10 @@ class Graph(Element): print('*** WARNING - The Graph element has not been finalized and cannot be drawn upon ***') print('Call Window.Finalize() prior to this operation') return None - print(f'Draw Point', point, converted_point) rpoint = remi.gui.SvgCircle(converted_point[0], converted_point[1], size) rpoint.set_stroke(size, color) rpoint.set_fill(color) - self.Widget.append([rpoint,]) + self.SvgGroup.append([rpoint,]) return rpoint @@ -1771,12 +1775,12 @@ class Graph(Element): print('*** WARNING - The Graph element has not been finalized and cannot be drawn upon ***') print('Call Window.Finalize() prior to this operation') return None - print(f'Draw Circle', center_location, converted_point) rpoint = remi.gui.SvgCircle(converted_point[0], converted_point[1], radius=radius) rpoint.set_fill(fill_color) - self.Widget.append([rpoint,]) + self.SvgGroup.append([rpoint,]) return rpoint + def DrawOval(self, top_left, bottom_right, fill_color=None, line_color=None): converted_top_left = self._convert_xy_to_canvas_xy(top_left[0], top_left[1]) converted_bottom_right = self._convert_xy_to_canvas_xy(bottom_right[0], bottom_right[1]) @@ -1808,7 +1812,7 @@ class Graph(Element): rpoint = remi.gui.SvgRectangle(converted_top_left[0], converted_bottom_right[1], bottom_right[0]-top_left[0], top_left[1]-bottom_right[1]) rpoint.set_stroke(color=line_color) rpoint.set_fill(fill_color) - self.Widget.append([rpoint,]) + self.SvgGroup.append([rpoint,]) return rpoint @@ -1823,7 +1827,8 @@ class Graph(Element): return None rpoint = remi.gui.SvgText(converted_point[0], converted_point[1], text) - self.Widget.append([rpoint,]) + self.SvgGroup.append([rpoint,]) + self.SvgGroup.redraw() return rpoint @@ -1839,11 +1844,19 @@ class Graph(Element): print('*** WARNING - The Graph element has not been finalized and cannot be drawn upon ***') print('Call Window.Finalize() prior to this operation') return None - image_widget = SuperImage(image_source) - image_widget.attributes['x'] = converted_point[0] - image_widget.attributes['y'] = converted_point[1] + + + rpoint = remi.gui.SvgImage(image_source, converted_point[0], converted_point[0], size[0], size[1]) + i = int(time.time() * 1e6) + # rpoint.set_image(image_source) + self.SvgGroup.append([rpoint,]) + 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.append([image_widget,]) + # self.Widget.data = shape + # self.Widget.add_child("image", shape) + # self.Widget.append([shape,]) def Erase(self): if self.Widget is None: @@ -1851,6 +1864,8 @@ class Graph(Element): print('Call Window.Finalize() prior to this operation') return None self.Widget.empty() + self.SvgGroup = remi.gui.SvgGroup(0,0) + self.Widget.append(self.SvgGroup) def Update(self, background_color): if self.Widget is None: @@ -1864,11 +1879,26 @@ class Graph(Element): 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]) - if self._TKCanvas2 is None: + if self.Widget is None: print('*** WARNING - The Graph element has not been finalized and cannot be drawn upon ***') print('Call Window.Finalize() prior to this operation') return None - return # TODO + cur_x = float(self.SvgGroup.attributes['x']) + cur_y = float(self.SvgGroup.attributes['y']) + self.SvgGroup.set_position(cur_x - x_direction,cur_y - y_direction) + self.SvgGroup.redraw() + + + def Relocate(self, x, y): + shift_converted = self._convert_xy_to_canvas_xy(x, y) + if self.Widget is None: + 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() + self.SvgGroup.set_position(shift_converted[0], shift_converted[1]) + self.SvgGroup.redraw() + def MoveFigure(self, figure, x_direction, y_direction): figure = figure #type: remi.gui.SvgCircle @@ -1879,12 +1909,27 @@ 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() + # figure.empty() cur_x = float(figure.attributes['x']) cur_y = float(figure.attributes['y']) figure.set_position(cur_x - x_direction,cur_y - y_direction) figure.redraw() + def RelocateFigure(self, figure, x, y): + 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, y) + shift_amount = (shift_converted[0] - zero_converted[0], shift_converted[1] - zero_converted[1]) + if figure is None: + 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() + figure.set_position(shift_converted[0], shift_converted[1]) + figure.redraw() + + + @property def TKCanvas(self): if self._TKCanvas2 is None: @@ -3299,7 +3344,7 @@ class Window: self.master_widget = None self.window.App = self if userdata2 is None: - res_path = os.path.dirname(os.path.abspath(__file__)) + # res_path = os.path.dirname(os.path.abspath(__file__)) # print('res path', res_path) super(Window.MyApp, self).__init__(*args, static_file_path={'C':'c:','c':'c:','D':'d:', 'd':'d:', 'E':'e:', 'e':'e:', 'dot':'.', '.':'.'}) @@ -3395,6 +3440,7 @@ def base64_to_style_image(base64_image): x ="url('data:image/png;base64," x += str(base64_image) x += "')" + print(x) return x @@ -4551,7 +4597,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): elif element_type == ELEM_TYPE_IMAGE: element = element # type: Image # element.Widget = remi.gui.Image(element.Filename) - element.Widget = SuperImage(element.Filename) + element.Widget = SuperImage(element.Filename if element.Filename is not None else element.Data) do_font_and_color(element.Widget) if element.EnableEvents: element.Widget.onclick.connect(element.ChangedCallback) @@ -4603,6 +4649,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): elif element_type == ELEM_TYPE_GRAPH: element = element # type: Graph element.Widget = remi.gui.Svg(width=element.CanvasSize[0], height=element.CanvasSize[1]) + element.SvgGroup = remi.gui.SvgGroup(0,0) + element.Widget.append([element.SvgGroup,]) do_font_and_color(element.Widget) if element.ChangeSubmits: element.Widget.onclick.connect(element.ChangedCallback) @@ -6698,6 +6746,8 @@ def main(): [Combo(values=['Combo 1', 'Combo 2', 'Combo 3'], default_value='Combo 2', key='_COMBO_', enable_events=True, readonly=False, tooltip='Combo box', disabled=False, size=(12, 1))], [Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), enable_events =True, size=(10, 3), key='_LIST_')], + [Image(filename=r'C:\Python\PycharmProjects\GooeyGUI\logo200.png', enable_events=True)], + [Image(data=DEFAULT_BASE64_ICON)], [Slider((1, 100), default_value=80, key='_SLIDER_', visible=True, enable_events=True, orientation='v')], [Spin(values=(1, 2, 3), initial_value='2', size=(4, 1), key='_SPIN_', enable_events=True)], [OK(), Button('Hidden', visible=False, key='_HIDDEN_'), Button('Values'), Button('Exit', button_color=('white', 'red')), Button('UnHide')] From ae67c29924f56a24af568e1b1962044d70ca8d8f Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy <13696193+MikeTheWatchGuy@users.noreply.github.com> Date: Mon, 22 Apr 2019 18:39:41 -0400 Subject: [PATCH 04/13] readme.md updated from https://stackedit.io/ --- readme.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/readme.md b/readme.md index a196f52f..97d8871c 100644 --- a/readme.md +++ b/readme.md @@ -33,15 +33,15 @@ -![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_3.x_Version-3.28.0-red.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_3.x_Version-3.2.0-red.svg?longCache=true&style=for-the-badge) -![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_2.7_Version-1.28.0-blue.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_2.7_Version-1.2.0-blue.svg?longCache=true&style=for-the-badge) ![Python Version](https://img.shields.io/badge/PySimpleGUIQt_Version-0.26.0-orange.svg?longCache=true&style=for-the-badge) -![Python Version](https://img.shields.io/badge/PySimpleGUIWx_version-0.11.0-orange.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUIWx_version-0..0-orange.svg?longCache=true&style=for-the-badge) -![Python Version](https://img.shields.io/badge/PySimpleGUIWeb_Version-0.22.0-orange.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUIWeb_Version-0.2218.0-orange.svg?longCache=true&style=for-the-badge) [Announcements of Latest Developments](https://github.com/MikeTheWatchGuy/PySimpleGUI/issues/142) @@ -4882,7 +4882,7 @@ Emergency patch release... going out same day as previous release * Combobox Styling (again) -# 3.23.0 PySimpleGUI / 1.23.0 PySimpleGUI27 16-Jan-2019 +# 3.2.0 PySimpleGUI / 1.23.0 PySimpleGUI27 16-Jan-2019 * Animated GIFs! * Calendar Chooser stays on top of other windows @@ -4985,10 +4985,10 @@ GNU Lesser General Public License (LGPL 3) + #### SORRY!! Will add these back. Lost due to file length limitation \ No newline at end of file From 2dfe77da2e92dc017025e3af37f08ac396a485a9 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy <13696193+MikeTheWatchGuy@users.noreply.github.com> Date: Mon, 22 Apr 2019 18:39:43 -0400 Subject: [PATCH 05/13] PySimpleGUIWx/readme.md updated from https://stackedit.io/ --- PySimpleGUIWx/readme.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PySimpleGUIWx/readme.md b/PySimpleGUIWx/readme.md index d45963ee..930e1b66 100644 --- a/PySimpleGUIWx/readme.md +++ b/PySimpleGUIWx/readme.md @@ -7,7 +7,7 @@ ![Python Version](https://img.shields.io/badge/Python-3.x-yellow.svg) -![Python Version](https://img.shields.io/badge/PySimpleGUIWx_For_Python_3.x_Version-0.11.0-orange.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUIWx_For_Python_3.x_Version-0..0-orange.svg?longCache=true&style=for-the-badge) @@ -376,5 +376,6 @@ Starting with release 0.4.0, most of the Popup functions work. This means you c # Acknowledgments \ No newline at end of file From cb36472a9a41a9fd40a4311a4740cbbe322e4607 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy <13696193+MikeTheWatchGuy@users.noreply.github.com> Date: Mon, 22 Apr 2019 18:39:46 -0400 Subject: [PATCH 06/13] PySimpleGUIQt/readme.md updated from https://stackedit.io/ --- PySimpleGUIQt/readme.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/PySimpleGUIQt/readme.md b/PySimpleGUIQt/readme.md index 1537cc64..84050c1d 100644 --- a/PySimpleGUIQt/readme.md +++ b/PySimpleGUIQt/readme.md @@ -16,7 +16,7 @@ ![Python Version](https://img.shields.io/badge/Python-3.x-yellow.svg) -![Python Version](https://img.shields.io/badge/PySimpleGUIQt_For_Python_3.x_Version-00.26.0-orange.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUIQt_For_Python_3.x_Version-00.26431.0-orange.svg?longCache=true&style=for-the-badge) @@ -26,7 +26,7 @@ "Qt without the ugly" - ## The Alpha Release + ## The Alpha Release Version 0.231.0 [Announcements of Latest Developments](https://github.com/MikeTheWatchGuy/PySimpleGUI/issues/142) @@ -682,4 +682,7 @@ Dial - disable # License GNU Lesser General Public License (LGPL 3) + -# Acknowledgments \ No newline at end of file +# Acknowledgments + \ No newline at end of file From bb9cefd0e4ba59cb5f7e8a10274c1198be9156b6 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy <13696193+MikeTheWatchGuy@users.noreply.github.com> Date: Mon, 22 Apr 2019 18:39:48 -0400 Subject: [PATCH 07/13] PySimpleGUIWeb/readme.md updated from https://stackedit.io/ --- PySimpleGUIWeb/readme.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PySimpleGUIWeb/readme.md b/PySimpleGUIWeb/readme.md index 0b0b6603..d2b1adbd 100644 --- a/PySimpleGUIWeb/readme.md +++ b/PySimpleGUIWeb/readme.md @@ -315,6 +315,7 @@ New features * Image element works better? * Base64 not yet working + # Design # Author @@ -326,6 +327,7 @@ New features # Acknowledgments \ No newline at end of file From fe9d880e754c08da3af19c86b2c7e6148f374afe Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy <13696193+MikeTheWatchGuy@users.noreply.github.com> Date: Mon, 22 Apr 2019 18:39:55 -0400 Subject: [PATCH 08/13] docs/index.md updated from https://stackedit.io/ --- docs/index.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/index.md b/docs/index.md index a196f52f..7b41d7d9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -33,15 +33,15 @@ -![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_3.x_Version-3.28.0-red.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_3.x_Version-3.2.0-red.svg?longCache=true&style=for-the-badge) -![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_2.7_Version-1.28.0-blue.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_2.7_Version-1.2.0-blue.svg?longCache=true&style=for-the-badge) -![Python Version](https://img.shields.io/badge/PySimpleGUIQt_Version-0.26.0-orange.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUIQt_Version-0..0-orange.svg?longCache=true&style=for-the-badge) -![Python Version](https://img.shields.io/badge/PySimpleGUIWx_version-0.11.0-orange.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUIWx_version-0..0-orange.svg?longCache=true&style=for-the-badge) -![Python Version](https://img.shields.io/badge/PySimpleGUIWeb_Version-0.22.0-orange.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUIWeb_Version-0.2218.0-orange.svg?longCache=true&style=for-the-badge) [Announcements of Latest Developments](https://github.com/MikeTheWatchGuy/PySimpleGUI/issues/142) @@ -4985,10 +4985,10 @@ GNU Lesser General Public License (LGPL 3) + #### SORRY!! Will add these back. Lost due to file length limitation \ No newline at end of file From 9a31632ce27b1a5c20c1d5e395e29e32ffbe9c9a Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy <13696193+MikeTheWatchGuy@users.noreply.github.com> Date: Mon, 22 Apr 2019 18:41:33 -0400 Subject: [PATCH 09/13] readme.md updated from https://stackedit.io/ --- readme.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/readme.md b/readme.md index 97d8871c..c70ad14f 100644 --- a/readme.md +++ b/readme.md @@ -4925,6 +4925,10 @@ Mixup.... 3.26 changes don't appear to have been correctly released so releasing * Convert button text to string when creating buttons * Buttons are returned now as well as input fields when searching for element with focus +## 3.29 22-Apr-2019 + +* New method for `Graph` - `RelocateFigure` +* Output Element no longer accepts focus ### Upcoming Make suggestions people! Future release features @@ -4985,10 +4989,10 @@ GNU Lesser General Public License (LGPL 3) + #### SORRY!! Will add these back. Lost due to file length limitation \ No newline at end of file From ee38171235f2c7f35a26486f3f02db3cfcf14ba9 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy <13696193+MikeTheWatchGuy@users.noreply.github.com> Date: Mon, 22 Apr 2019 18:43:11 -0400 Subject: [PATCH 10/13] readme.md updated from https://stackedit.io/ --- readme.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/readme.md b/readme.md index c70ad14f..a923189b 100644 --- a/readme.md +++ b/readme.md @@ -33,9 +33,9 @@ -![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_3.x_Version-3.2.0-red.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_3.x_Version-3.29.0-red.svg?longCache=true&style=for-the-badge) -![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_2.7_Version-1.2.0-blue.svg?longCache=true&style=for-the-badge) +![Python Version](https://img.shields.io/badge/PySimpleGUI_For_Python_2.7_Version-1.29.0-blue.svg?longCache=true&style=for-the-badge) ![Python Version](https://img.shields.io/badge/PySimpleGUIQt_Version-0.26.0-orange.svg?longCache=true&style=for-the-badge) @@ -3095,6 +3095,7 @@ After you supply those values you can scribble all of over your graph by creatin * DrawPoint * DrawRectangle * DrawOval +* DrawImage You can move your figures around on the canvas by supplying the Figure ID the x,y amount to move. @@ -4932,9 +4933,7 @@ Mixup.... 3.26 changes don't appear to have been correctly released so releasing ### Upcoming Make suggestions people! Future release features - -Port to other graphic engines. Hook up the front-end interface to a backend other than tkinter. Qt, WxPython, etc. At the moment, Wx and Kivy are being considered for the next GUI framework. Work has already begun on Wx. Kivy is likely to be next instead of Wx however. - + ## Code Condition @@ -4989,7 +4988,7 @@ GNU Lesser General Public License (LGPL 3) + #### SORRY!! Will add these back. Lost due to file length limitation \ No newline at end of file From 151c418abf61ddda57ecaae83a7340bb0a1b1943 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy <13696193+MikeTheWatchGuy@users.noreply.github.com> Date: Mon, 22 Apr 2019 18:46:26 -0400 Subject: [PATCH 12/13] readme.md updated from https://stackedit.io/ --- readme.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/readme.md b/readme.md index 027ddb4c..47253a41 100644 --- a/readme.md +++ b/readme.md @@ -4937,8 +4937,7 @@ Mixup.... 3.26 changes don't appear to have been correctly released so releasing ### Upcoming Make suggestions people! Future release features - - + ## Code Condition Make it run @@ -4977,10 +4976,9 @@ tkinter is the "official" GUI that Python supports. It runs on Windows, Linux, From the start of the PSG project, tkinter was not meant to be the only underlying GUI framework for PySimpleGUI. It is merely a starting point. All journeys begin with one step forward and choosing tkinter was the first of many steps for PySimpleGUI. Now there are 4 ports up and running - tkinter, WxPython, Qt and Remi (web support) - ## Author -MikeB +Mike - who wrote PySimpleGUI is not important. It's the software that's import ## License @@ -4991,7 +4989,7 @@ GNU Lesser General Public License (LGPL 3) + #### SORRY!! Will add these back. Lost due to file length limitation