From 0e0a6c437cae6663b49d2d99fee680a9c0b3b5eb Mon Sep 17 00:00:00 2001 From: PySimpleGUI Date: Fri, 17 Jan 2020 15:28:28 -0500 Subject: [PATCH 1/2] Made fade-in-duration a parameter. Added docstrings --- ...emo_Notification_Window_Multiprocessing.py | 45 +++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/DemoPrograms/Demo_Notification_Window_Multiprocessing.py b/DemoPrograms/Demo_Notification_Window_Multiprocessing.py index 2abb5035..27953999 100644 --- a/DemoPrograms/Demo_Notification_Window_Multiprocessing.py +++ b/DemoPrograms/Demo_Notification_Window_Multiprocessing.py @@ -25,7 +25,8 @@ WIN_MARGIN = 60 WIN_COLOR = "#282828" TEXT_COLOR = "#ffffff" -DEFAULT_DISPLAY_DURATION_IN_MILLISECONDS = 3000 +DEFAULT_DISPLAY_DURATION_IN_MILLISECONDS = 3000 # how long to display the window +DEFAULT_FADE_IN_DURATION = 2000 # how long to fade in / fade out the window # Base64 Images to use as icons in the window image64_error = b'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAADlAAAA5QGP5Zs8AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAIpQTFRF////20lt30Bg30pg4FJc409g4FBe4E9f4U9f4U9g4U9f4E9g31Bf4E9f4E9f4E9f4E9f4E9f4FFh4Vdm4lhn42Bv5GNx5W575nJ/6HqH6HyI6YCM6YGM6YGN6oaR8Kev9MPI9cbM9snO9s3R+Nfb+dzg+d/i++vt/O7v/fb3/vj5//z8//7+////KofnuQAAABF0Uk5TAAcIGBktSYSXmMHI2uPy8/XVqDFbAAAA8UlEQVQ4y4VT15LCMBBTQkgPYem9d9D//x4P2I7vILN68kj2WtsAhyDO8rKuyzyLA3wjSnvi0Eujf3KY9OUP+kno651CvlB0Gr1byQ9UXff+py5SmRhhIS0oPj4SaUUCAJHxP9+tLb/ezU0uEYDUsCc+l5/T8smTIVMgsPXZkvepiMj0Tm5txQLENu7gSF7HIuMreRxYNkbmHI0u5Hk4PJOXkSMz5I3nyY08HMjbpOFylF5WswdJPmYeVaL28968yNfGZ2r9gvqFalJNUy2UWmq1Wa7di/3Kxl3tF1671YHRR04dWn3s9cXRV09f3vb1fwPD7z9j1WgeRgAAAABJRU5ErkJggg==' @@ -34,7 +35,21 @@ image64_success = b'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb # ------------------------------------------------------------------- -def _display_notification(title, message, icon=image64_success, display_duration_in_ms=DEFAULT_DISPLAY_DURATION_IN_MILLISECONDS, use_fade_in=True, alpha=0.9, location=None): +def _display_notification(title, message, icon=image64_success, display_duration_in_ms=DEFAULT_DISPLAY_DURATION_IN_MILLISECONDS, fade_in_duration=DEFAULT_FADE_IN_DURATION, alpha=0.9, location=None): + """ + Displays a "notification window", usually in the bottom right corner of your display. Has an icon, a title, and a message + The window will slowly fade in and out if desired. Clicking on the window will cause it to move through the end the current "phase". For + example, if the window was fading in and it was clicked, then it would immediately stop fading in and instead be fully visible. It + a way for the user to quickly dismiss the window. + :param title: (str) Text to be shown at the top of the window in a larger font + :param message: (str) Text message that makes up the majority of the window + :param icon: (base64) A base64 encoded PNG/GIF image that will be displayed in the window + :param display_duration_in_ms: (int) Number of milliseconds to show the window + :param fade_in_duration: (int) Number of milliseconds to fade window in and out + :param alpha: (float) Alpha channel. 0 - invisible 1 - fully visible + :param location: Tuple[int, int] Location on the screen to display the window + :return: (Any) The Process ID returned from calling multiprocessing.Process + """ # Compute location and size of the window message = textwrap.fill(message, 50) win_msg_lines = message.count("\n") + 1 @@ -55,10 +70,10 @@ def _display_notification(title, message, icon=image64_success, display_duration window["-GRAPH-"].draw_text(message, location=(64, 44), color=TEXT_COLOR, font=("Arial", 9), text_location=sg.TEXT_LOCATION_TOP_LEFT) window["-GRAPH-"].set_cursor('hand2') - if use_fade_in == True: + if fade_in_duration: for i in range(1,int(alpha*100)): # fade in window.set_alpha(i/100) - event, values = window.read(timeout=20) + event, values = window.read(timeout=fade_in_duration // 100) if event != sg.TIMEOUT_KEY: window.set_alpha(1) break @@ -66,7 +81,7 @@ def _display_notification(title, message, icon=image64_success, display_duration if event == sg.TIMEOUT_KEY: for i in range(int(alpha*100),1,-1): # fade out window.set_alpha(i/100) - event, values = window.read(timeout=20) + event, values = window.read(timeout=fade_in_duration // 100) if event != sg.TIMEOUT_KEY: break else: @@ -76,14 +91,28 @@ def _display_notification(title, message, icon=image64_success, display_duration window.close() -def display_notification(title, message, icon=image64_success, display_duration_in_ms=DEFAULT_DISPLAY_DURATION_IN_MILLISECONDS, use_fade_in=True, alpha=0.9, location=None): - proc = Process(target=_display_notification, args=(title, message, icon,display_duration_in_ms, use_fade_in, alpha, location)) +def display_notification(title, message, icon=image64_success, display_duration_in_ms=DEFAULT_DISPLAY_DURATION_IN_MILLISECONDS, fade_in_duration=DEFAULT_FADE_IN_DURATION, alpha=0.9, location=None): + """ + Displays a "notification window", usually in the bottom right corner of your display. Has an icon, a title, and a message + The window will slowly fade in and out if desired. Clicking on the window will cause it to move through the end the current "phase". For + example, if the window was fading in and it was clicked, then it would immediately stop fading in and instead be fully visible. It + a way for the user to quickly dismiss the window. + :param title: (str) Text to be shown at the top of the window in a larger font + :param message: (str) Text message that makes up the majority of the window + :param icon: (base64) A base64 encoded PNG/GIF image that will be displayed in the window + :param display_duration_in_ms: (int) Number of milliseconds to show the window + :param fade_in_duration: (int) Number of milliseconds to fade window in and out + :param alpha: (float) Alpha channel. 0 - invisible 1 - fully visible + :param location: Tuple[int, int] Location on the screen to display the window + :return: (Any) The Process ID returned from calling multiprocessing.Process + """ + proc = Process(target=_display_notification, args=(title, message, icon, display_duration_in_ms, fade_in_duration, alpha, location)) proc.start() return proc if __name__ == '__main__': proc2 = display_notification('Normal Location', 'This is my notification!') - proc3 = display_notification('Upper Left', 'This one does not fade in!', icon=image64_error, location=(0,0), use_fade_in=False) + proc3 = display_notification('Upper Left', 'This one does not fade in!', icon=image64_error, location=(0,0), fade_in_duration=0) proc3.join() proc2.join() From 576c453e3e88202157fdf2fbffcd86dc9e016d17 Mon Sep 17 00:00:00 2001 From: PySimpleGUI Date: Sat, 18 Jan 2020 08:21:01 -0500 Subject: [PATCH 2/2] Added a new line/wall with caused some interesting interactions --- DemoPrograms/Demo_Graph_Ball_Game.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/DemoPrograms/Demo_Graph_Ball_Game.py b/DemoPrograms/Demo_Graph_Ball_Game.py index 5dca7ef8..355083b7 100644 --- a/DemoPrograms/Demo_Graph_Ball_Game.py +++ b/DemoPrograms/Demo_Graph_Ball_Game.py @@ -37,7 +37,7 @@ class Playfield(): self.add_wall((0, 400), (600, 400)) # ground self.add_wall((0, 0), (0, 600)) # Left side self.add_wall((600, 0), (600, 400)) # right side - self.arena_balls = [] # type: [] Ball + self.arena_balls = [] # type: List[Ball] self.graph_elem = graph_elem # type: sg.Graph def add_wall(self, pt_from, pt_to): @@ -45,6 +45,7 @@ class Playfield(): ground_shape = pymunk.Segment(body, pt_from, pt_to, 0.0) ground_shape.friction = 0.8 ground_shape.elasticity = .99 + ground_shape.mass = pymunk.inf self.space.add(ground_shape) def add_random_balls(self): @@ -82,9 +83,11 @@ layout = [[sg.Text('Ball Test'), sg.Text('My IP {}'.format(hostname))], sg.Button('Player 2 Shoot', size=(15, 2)), sg.Button('Exit')] ] -window = sg.Window('Window Title', layout, disable_close=True) +window = sg.Window('Window Title', layout, disable_close=True, finalize=True) area = Playfield(graph_elem) +area.add_wall((0,300), (300,300)) +graph_elem.draw_line((0,300),(300,300)) # area.add_random_balls() # ------------------- GUI Event Loop -------------------