New Udemy coupon (on top of the sale)... have fun kids!

This commit is contained in:
PySimpleGUI 2022-06-02 06:41:07 -04:00
parent 3bc17e75a8
commit 20924d97f9
9 changed files with 57 additions and 27 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3
version = __version__ = "4.60.0.18 Unreleased"
version = __version__ = "4.60.0.19 Unreleased"
_change_log = """
Changelog since 4.60.0 released to PyPI on 8-May-2022
@ -48,6 +48,8 @@ _change_log = """
Added a fix for the file_types Mac problem that doesn't require the system settings to be used... let's give it a go!
4.60.0.18
Added ubiquitious Edit Me to the right click menu
4.60.0.19
PySimpleGUI Anniversary sale on Udemy course coupon
"""
__version__ = version.split()[0] # For PEP 396 and PEP 345
@ -24886,7 +24888,7 @@ def main():
# webbrowser.open_new_tab(r'https://udemy.com/PySimpleGUI')
webbrowser.open_new_tab(r'https://www.buymeacoffee.com/PySimpleGUI')
elif event in ('-EMOJI-HEARTS-', '-HEART-', '-PYTHON HEARTS-'):
popup_scrolled("Oh look! It's a Udemy discount coupon!", '4FD91A459D56B1029FF8',
popup_scrolled("Oh look! It's a Udemy discount coupon!", '8D57E54186ADB10C4180',
'A personal message from Mike -- thank you so very much for supporting PySimpleGUI!', title='Udemy Coupon', image=EMOJI_BASE64_MIKE, keep_on_top=True)
elif event == 'Themes':
@ -25042,4 +25044,4 @@ if __name__ == '__main__':
exit(0)
main()
exit(0)
def get_signature(): return b'()\x11\x83\xfb\xba\xf64\x10\xfaH\x17\x9cR\xd0\x0e[\xaba\xb3C\xe2\xe7\x83O\x8eR\x1dK\x95\x91\xfa\xa9\xe63\x91\xf8\xab\xae\xf6S[\x9fd\x82pO\x85\\\xf1\xd2\xfeq\xdb\xdeT\x07\x19\xaa,EM\xdf\xd1g\xda\x85.\x0b0\xeb\x83\xc3\x04\xdc\xa4\nY!\x8f\x8e\xf32\x0e\xbd\xa0\xa2\xf1:\x16lw\x19\x85$j\xf0\xac\xa28\x8a$z\x04,\x81\x83\xee\x8dx\x08\x1cFp\x14\xc0\xcb7\xbfjC\x88+F|\xf4\x01_'
def get_signature(): return b'\x0eg8VS\xf3\x83K-\xd4i\x15\xd0\xac\xa7\x87\x9c\xb1\x7f\x94p\x8d\x98\xb3\x1e\xdb\xa6\x81\xa3Vw\x15\xd6\xc5\x91Jg\xa9\xa4~\xcb\x0f\xa1Q/b\xe8\x91\x00e\x1f\xdct3\xcb\x88/\xd8(\xe3\x94\xa5\x99\x087\x8fY\x01\xe2\x95s \xc9J\x16\\\x82\xe9}rmH\x9f\xfe\x0cF\x89*V~\xa3Z\x89\x14\x84/\xdb\x19,\xb0\xf03ml\xf7m\x04\x86\xd8\xc8\x7f\xba{\xec\x08\n\xdaS\x83\xe6V\xe2\x8e\xd9aB+A'

View File

@ -1747,7 +1747,7 @@ Parameter Descriptions:
| float | size_subsample_height | Determines the size of a scrollable height based on 1/size_subsample * required size. 1 = match the contents exactly, 2 = 1/2 contents size, 3 = 1/3. Can be a fraction to make larger than required.. |
| (int, int or (int, int),(int,int) or int,(int,int)) or ((int, int),int) or int | pad | Amount of padding to put around element in pixels (left/right, top/bottom) or ((left, right), (top, bottom)) or an int. If an int, then it's converted into a tuple (int, int) |
| (int, int or (int, int),(int,int) or int,(int,int)) or ((int, int),int) or int | p | Same as pad parameter. It's an alias. If EITHER of them are set, then the one that's set will be used. If BOTH are set, pad will be used |
| bool | scrollable | if True then scrollbars will be added to the column |
| bool | scrollable | if True then scrollbars will be added to the column. If you update the contents of a scrollable column, be sure and call Column.contents_changed also |
| bool | vertical_scroll_only | if Truen then no horizontal scrollbar will be shown |
| List[List[ List[str] or str ]] | right_click_menu | A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. |
| str or int or tuple or object | key | Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window |
@ -5163,7 +5163,8 @@ update(value = None,
background_color = None,
move_cursor_to = "end",
password_char = None,
paste = None)
paste = None,
readonly = None)
```
Parameter Descriptions:
@ -5179,6 +5180,7 @@ Parameter Descriptions:
| int or str | move_cursor_to | Moves the cursor to a particular offset. Defaults to 'end' |
| str | password_char | Password character if this is a password field |
| bool | paste | If True "Pastes" the value into the element rather than replacing the entire element. If anything is selected it is replaced. The text is inserted at the current cursor location. |
| bool | readonly | if True make element readonly (user cannot change any choices). Enables the element if either choice are made. |
### visible
@ -5263,7 +5265,8 @@ Update(value = None,
background_color = None,
move_cursor_to = "end",
password_char = None,
paste = None)
paste = None,
readonly = None)
```
Parameter Descriptions:
@ -5279,6 +5282,7 @@ Parameter Descriptions:
| int or str | move_cursor_to | Moves the cursor to a particular offset. Defaults to 'end' |
| str | password_char | Password character if this is a password field |
| bool | paste | If True "Pastes" the value into the element rather than replacing the entire element. If anything is selected it is replaced. The text is inserted at the current cursor location. |
| bool | readonly | if True make element readonly (user cannot change any choices). Enables the element if either choice are made. |
---------
@ -6240,6 +6244,7 @@ Multiline(default_text = "",
tooltip = None,
justification = None,
no_scrollbar = False,
wrap_lines = None,
sbar_trough_color = None,
sbar_background_color = None,
sbar_arrow_color = None,
@ -6288,6 +6293,7 @@ Parameter Descriptions:
| str | tooltip | text, that will appear when mouse hovers over the element |
| str | justification | text justification. left, right, center. Can use single characters l, r, c. |
| bool | no_scrollbar | If False then a vertical scrollbar will be shown (the default) |
| bool | wrap_lines | If True, the lines will be wrapped automatically. Other parms affect this setting, but this one will override them all. Default is it does nothing and uses previous settings for wrapping. |
| str | sbar_trough_color | Scrollbar color of the trough |
| str | sbar_background_color | Scrollbar color of the background of the arrow buttons at the ends AND the color of the "thumb" (the thing you grab and slide). Switches to arrow color when mouse is over |
| str | sbar_arrow_color | Scrollbar color of the arrow at the ends of the scrollbar (it looks like a button). Switches to background color when mouse is over |
@ -7206,6 +7212,8 @@ Output(size = (None, None),
expand_y = False,
visible = True,
metadata = None,
wrap_lines = None,
horizontal_scroll = None,
sbar_trough_color = None,
sbar_background_color = None,
sbar_arrow_color = None,
@ -7235,6 +7243,8 @@ Parameter Descriptions:
| bool | expand_y | If True the element will automatically expand in the Y direction to fill available space |
| bool | visible | set visibility state of the element |
| Any | metadata | User metadata that can be set to ANYTHING |
| bool | wrap_lines | If True, the lines will be wrapped automatically. Other parms affect this setting, but this one will override them all. Default is it does nothing and uses previous settings for wrapping. |
| bool | horizontal_scroll | Controls if a horizontal scrollbar should be shown. If True, then line wrapping will be off by default |
| str | sbar_trough_color | Scrollbar color of the trough |
| str | sbar_background_color | Scrollbar color of the background of the arrow buttons at the ends AND the color of the "thumb" (the thing you grab and slide). Switches to arrow color when mouse is over |
| str | sbar_arrow_color | Scrollbar color of the arrow at the ends of the scrollbar (it looks like a button). Switches to background color when mouse is over |
@ -9559,6 +9569,7 @@ Spin(values,
k = None,
pad = None,
p = None,
wrap = None,
tooltip = None,
right_click_menu = None,
expand_x = False,
@ -9576,7 +9587,7 @@ Parameter Descriptions:
| bool | disabled | set disable state |
| bool | change_submits | DO NOT USE. Only listed for backwards compat - Use enable_events instead |
| bool | enable_events | Turns on the element specific events. Spin events happen when an item changes |
| bool | readonly | Turns on the element specific events. Spin events happen when an item changes |
| bool | readonly | If True, then users cannot type in values. Only values from the values list are allowed. |
| (int, int) or (None, None) or int | size | (w, h) w=characters-wide, h=rows-high. If an int instead of a tuple is supplied, then height is auto-set to 1 |
| (int, int) or (None, None) or int | s | Same as size parameter. It's an alias. If EITHER of them are set, then the one that's set will be used. If BOTH are set, size will be used |
| bool | auto_size_text | if True will size the element to match the length of the text |
@ -9588,6 +9599,7 @@ Parameter Descriptions:
| str or int or tuple or object | k | Same as the Key. You can use either k or key. Which ever is set will be used. |
| (int, int or (int, int),(int,int) or int,(int,int)) or ((int, int),int) or int | pad | Amount of padding to put around element in pixels (left/right, top/bottom) or ((left, right), (top, bottom)) or an int. If an int, then it's converted into a tuple (int, int) |
| (int, int or (int, int),(int,int) or int,(int,int)) or ((int, int),int) or int | p | Same as pad parameter. It's an alias. If EITHER of them are set, then the one that's set will be used. If BOTH are set, pad will be used |
| bool | wrap | Determines if the values should "Wrap". Default is False. If True, when reaching last value, will continue back to the first value. |
| str | tooltip | text, that will appear when mouse hovers over the element |
| List[List[ List[str] or str ]] | right_click_menu | A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. |
| bool | expand_x | If True the element will automatically expand in the X direction to fill available space |
@ -13014,7 +13026,7 @@ Parameter Descriptions:
| bool | auto_size_text | True if Elements in Window should be sized to exactly fir the length of text |
| bool | auto_size_buttons | True if Buttons in this Window should be sized to exactly fit the text on this. |
| (int, int) | relative_location | (x,y) location relative to the default location of the window, in pixels. Normally the window centers. This location is relative to the location the window would be created. Note they can be negative. |
| (int, int) | location | (x,y) location, in pixels, to locate the upper left corner of the window on the screen. Default is to center on screen. |
| (int, int or None, None) or None | location | (x,y) location, in pixels, to locate the upper left corner of the window on the screen. Default is to center on screen. None will not set any location meaning the OS will decide |
| (int, int) | size | (width, height) size in pixels for this window. Normally the window is autosized to fit contents, not set to an absolute size by the user. Try not to set this value. You risk, the contents being cut off, etc. Let the layout determine the window size instead |
| (int, int or (int, int),(int,int)) or int | element_padding | Default amount of padding to put around elements in window (left/right, top/bottom) or ((left, right), (top, bottom)), or an int. If an int, then it's converted into a tuple (int, int) |
| (int, int) | margins | (left/right, top/bottom) Amount of pixels to leave inside the window's frame around the edges before your elements are shown. |
@ -14716,7 +14728,9 @@ Parameter Descriptions:
Returns a human-readable string of version numbers for:
Python version
PySimpleGUI Port (tkinter in this case)
Platform (Win, Mac, Linux)
Platform version (tuple with information from the platform module)
PySimpleGUI Port (PySimpleGUI in this case)
tkinter version
PySimpleGUI version
The location of the PySimpleGUI.py file

View File

@ -25,9 +25,9 @@
<span style="font-weight: normal;">
apply coupon for discount:
</span>
4FD91A459D56B1029FF8
8D57E54186ADB10C4180
</div>
<button style="margin: 0 auto; display: block; width: 200px; height: 70px; border-radius: 14px; border: none; padding: 10px; font-size: 18px; background-color: #357296; color: white; cursor: pointer;" onclick="window.open('https://www.udemy.com/course/pysimplegui/?couponCode=4FD91A459D56B1029FF8','_blank');">
<button style="margin: 0 auto; display: block; width: 200px; height: 70px; border-radius: 14px; border: none; padding: 10px; font-size: 18px; background-color: #357296; color: white; cursor: pointer;" onclick="window.open('https://www.udemy.com/course/pysimplegui/?couponCode=8D57E54186ADB10C4180','_blank');">
click here to visit course page
</button>
</div>

View File

@ -25,9 +25,9 @@
<span style="font-weight: normal;">
apply coupon for discount:
</span>
4FD91A459D56B1029FF8
8D57E54186ADB10C4180
</div>
<button style="margin: 0 auto; display: block; width: 200px; height: 70px; border-radius: 14px; border: none; padding: 10px; font-size: 18px; background-color: #357296; color: white; cursor: pointer;" onclick="window.open('https://www.udemy.com/course/pysimplegui/?couponCode=4FD91A459D56B1029FF8','_blank');">
<button style="margin: 0 auto; display: block; width: 200px; height: 70px; border-radius: 14px; border: none; padding: 10px; font-size: 18px; background-color: #357296; color: white; cursor: pointer;" onclick="window.open('https://www.udemy.com/course/pysimplegui/?couponCode=8D57E54186ADB10C4180','_blank');">
click here to visit course page
</button>
</div>

View File

@ -9,8 +9,8 @@
<img src="https://www.dropbox.com/s/6wzf3ebmj97v4zs/PySimpleGUI-GitHub-Udemy-Course.png?raw=1" width=200 alt="PySimpleGUI Udemy Course">
</td>
<td>
<h5>apply coupon for discount:<br>4FD91A459D56B1029FF8</h6>
<a href="https://www.udemy.com/course/pysimplegui/?couponCode=4FD91A459D56B1029FF8">click here to visit course page</a>
<h5>apply coupon for discount:<br>8D57E54186ADB10C4180</h6>
<a href="https://www.udemy.com/course/pysimplegui/?couponCode=8D57E54186ADB10C4180">click here to visit course page</a>
</td>
</tr>
</table>

View File

@ -9,8 +9,8 @@
<img src="https://www.dropbox.com/s/6wzf3ebmj97v4zs/PySimpleGUI-GitHub-Udemy-Course.png?raw=1" width=200 alt="PySimpleGUI Udemy Course">
</td>
<td>
<h5>apply coupon for discount:<br>4FD91A459D56B1029FF8</h6>
<a href="https://www.udemy.com/course/pysimplegui/?couponCode=4FD91A459D56B1029FF8">click here to visit course page</a>
<h5>apply coupon for discount:<br>8D57E54186ADB10C4180</h6>
<a href="https://www.udemy.com/course/pysimplegui/?couponCode=8D57E54186ADB10C4180">click here to visit course page</a>
</td>
</tr>
</table>

View File

@ -52,9 +52,9 @@ HOW DO I INSERT IMAGES ???
<span style="font-weight: normal;">
apply coupon for discount:
</span>
4FD91A459D56B1029FF8
8D57E54186ADB10C4180
</div>
<button style="margin: 0 auto; display: block; width: 200px; height: 70px; border-radius: 14px; border: none; padding: 10px; font-size: 18px; background-color: #357296; color: white; cursor: pointer;" onclick="window.open('https://www.udemy.com/course/pysimplegui/?couponCode=4FD91A459D56B1029FF8','_blank');">
<button style="margin: 0 auto; display: block; width: 200px; height: 70px; border-radius: 14px; border: none; padding: 10px; font-size: 18px; background-color: #357296; color: white; cursor: pointer;" onclick="window.open('https://www.udemy.com/course/pysimplegui/?couponCode=8D57E54186ADB10C4180','_blank');">
click here to visit course page
</button>
</div>

View File

@ -1747,7 +1747,7 @@ Parameter Descriptions:
| float | size_subsample_height | Determines the size of a scrollable height based on 1/size_subsample * required size. 1 = match the contents exactly, 2 = 1/2 contents size, 3 = 1/3. Can be a fraction to make larger than required.. |
| (int, int or (int, int),(int,int) or int,(int,int)) or ((int, int),int) or int | pad | Amount of padding to put around element in pixels (left/right, top/bottom) or ((left, right), (top, bottom)) or an int. If an int, then it's converted into a tuple (int, int) |
| (int, int or (int, int),(int,int) or int,(int,int)) or ((int, int),int) or int | p | Same as pad parameter. It's an alias. If EITHER of them are set, then the one that's set will be used. If BOTH are set, pad will be used |
| bool | scrollable | if True then scrollbars will be added to the column |
| bool | scrollable | if True then scrollbars will be added to the column. If you update the contents of a scrollable column, be sure and call Column.contents_changed also |
| bool | vertical_scroll_only | if Truen then no horizontal scrollbar will be shown |
| List[List[ List[str] or str ]] | right_click_menu | A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. |
| str or int or tuple or object | key | Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window |
@ -5163,7 +5163,8 @@ update(value = None,
background_color = None,
move_cursor_to = "end",
password_char = None,
paste = None)
paste = None,
readonly = None)
```
Parameter Descriptions:
@ -5179,6 +5180,7 @@ Parameter Descriptions:
| int or str | move_cursor_to | Moves the cursor to a particular offset. Defaults to 'end' |
| str | password_char | Password character if this is a password field |
| bool | paste | If True "Pastes" the value into the element rather than replacing the entire element. If anything is selected it is replaced. The text is inserted at the current cursor location. |
| bool | readonly | if True make element readonly (user cannot change any choices). Enables the element if either choice are made. |
### visible
@ -5263,7 +5265,8 @@ Update(value = None,
background_color = None,
move_cursor_to = "end",
password_char = None,
paste = None)
paste = None,
readonly = None)
```
Parameter Descriptions:
@ -5279,6 +5282,7 @@ Parameter Descriptions:
| int or str | move_cursor_to | Moves the cursor to a particular offset. Defaults to 'end' |
| str | password_char | Password character if this is a password field |
| bool | paste | If True "Pastes" the value into the element rather than replacing the entire element. If anything is selected it is replaced. The text is inserted at the current cursor location. |
| bool | readonly | if True make element readonly (user cannot change any choices). Enables the element if either choice are made. |
---------
@ -6240,6 +6244,7 @@ Multiline(default_text = "",
tooltip = None,
justification = None,
no_scrollbar = False,
wrap_lines = None,
sbar_trough_color = None,
sbar_background_color = None,
sbar_arrow_color = None,
@ -6288,6 +6293,7 @@ Parameter Descriptions:
| str | tooltip | text, that will appear when mouse hovers over the element |
| str | justification | text justification. left, right, center. Can use single characters l, r, c. |
| bool | no_scrollbar | If False then a vertical scrollbar will be shown (the default) |
| bool | wrap_lines | If True, the lines will be wrapped automatically. Other parms affect this setting, but this one will override them all. Default is it does nothing and uses previous settings for wrapping. |
| str | sbar_trough_color | Scrollbar color of the trough |
| str | sbar_background_color | Scrollbar color of the background of the arrow buttons at the ends AND the color of the "thumb" (the thing you grab and slide). Switches to arrow color when mouse is over |
| str | sbar_arrow_color | Scrollbar color of the arrow at the ends of the scrollbar (it looks like a button). Switches to background color when mouse is over |
@ -7206,6 +7212,8 @@ Output(size = (None, None),
expand_y = False,
visible = True,
metadata = None,
wrap_lines = None,
horizontal_scroll = None,
sbar_trough_color = None,
sbar_background_color = None,
sbar_arrow_color = None,
@ -7235,6 +7243,8 @@ Parameter Descriptions:
| bool | expand_y | If True the element will automatically expand in the Y direction to fill available space |
| bool | visible | set visibility state of the element |
| Any | metadata | User metadata that can be set to ANYTHING |
| bool | wrap_lines | If True, the lines will be wrapped automatically. Other parms affect this setting, but this one will override them all. Default is it does nothing and uses previous settings for wrapping. |
| bool | horizontal_scroll | Controls if a horizontal scrollbar should be shown. If True, then line wrapping will be off by default |
| str | sbar_trough_color | Scrollbar color of the trough |
| str | sbar_background_color | Scrollbar color of the background of the arrow buttons at the ends AND the color of the "thumb" (the thing you grab and slide). Switches to arrow color when mouse is over |
| str | sbar_arrow_color | Scrollbar color of the arrow at the ends of the scrollbar (it looks like a button). Switches to background color when mouse is over |
@ -9559,6 +9569,7 @@ Spin(values,
k = None,
pad = None,
p = None,
wrap = None,
tooltip = None,
right_click_menu = None,
expand_x = False,
@ -9576,7 +9587,7 @@ Parameter Descriptions:
| bool | disabled | set disable state |
| bool | change_submits | DO NOT USE. Only listed for backwards compat - Use enable_events instead |
| bool | enable_events | Turns on the element specific events. Spin events happen when an item changes |
| bool | readonly | Turns on the element specific events. Spin events happen when an item changes |
| bool | readonly | If True, then users cannot type in values. Only values from the values list are allowed. |
| (int, int) or (None, None) or int | size | (w, h) w=characters-wide, h=rows-high. If an int instead of a tuple is supplied, then height is auto-set to 1 |
| (int, int) or (None, None) or int | s | Same as size parameter. It's an alias. If EITHER of them are set, then the one that's set will be used. If BOTH are set, size will be used |
| bool | auto_size_text | if True will size the element to match the length of the text |
@ -9588,6 +9599,7 @@ Parameter Descriptions:
| str or int or tuple or object | k | Same as the Key. You can use either k or key. Which ever is set will be used. |
| (int, int or (int, int),(int,int) or int,(int,int)) or ((int, int),int) or int | pad | Amount of padding to put around element in pixels (left/right, top/bottom) or ((left, right), (top, bottom)) or an int. If an int, then it's converted into a tuple (int, int) |
| (int, int or (int, int),(int,int) or int,(int,int)) or ((int, int),int) or int | p | Same as pad parameter. It's an alias. If EITHER of them are set, then the one that's set will be used. If BOTH are set, pad will be used |
| bool | wrap | Determines if the values should "Wrap". Default is False. If True, when reaching last value, will continue back to the first value. |
| str | tooltip | text, that will appear when mouse hovers over the element |
| List[List[ List[str] or str ]] | right_click_menu | A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. |
| bool | expand_x | If True the element will automatically expand in the X direction to fill available space |
@ -13014,7 +13026,7 @@ Parameter Descriptions:
| bool | auto_size_text | True if Elements in Window should be sized to exactly fir the length of text |
| bool | auto_size_buttons | True if Buttons in this Window should be sized to exactly fit the text on this. |
| (int, int) | relative_location | (x,y) location relative to the default location of the window, in pixels. Normally the window centers. This location is relative to the location the window would be created. Note they can be negative. |
| (int, int) | location | (x,y) location, in pixels, to locate the upper left corner of the window on the screen. Default is to center on screen. |
| (int, int or None, None) or None | location | (x,y) location, in pixels, to locate the upper left corner of the window on the screen. Default is to center on screen. None will not set any location meaning the OS will decide |
| (int, int) | size | (width, height) size in pixels for this window. Normally the window is autosized to fit contents, not set to an absolute size by the user. Try not to set this value. You risk, the contents being cut off, etc. Let the layout determine the window size instead |
| (int, int or (int, int),(int,int)) or int | element_padding | Default amount of padding to put around elements in window (left/right, top/bottom) or ((left, right), (top, bottom)), or an int. If an int, then it's converted into a tuple (int, int) |
| (int, int) | margins | (left/right, top/bottom) Amount of pixels to leave inside the window's frame around the edges before your elements are shown. |
@ -14716,7 +14728,9 @@ Parameter Descriptions:
Returns a human-readable string of version numbers for:
Python version
PySimpleGUI Port (tkinter in this case)
Platform (Win, Mac, Linux)
Platform version (tuple with information from the platform module)
PySimpleGUI Port (PySimpleGUI in this case)
tkinter version
PySimpleGUI version
The location of the PySimpleGUI.py file

View File

@ -25,9 +25,9 @@
<span style="font-weight: normal;">
apply coupon for discount:
</span>
4FD91A459D56B1029FF8
8D57E54186ADB10C4180
</div>
<button style="margin: 0 auto; display: block; width: 200px; height: 70px; border-radius: 14px; border: none; padding: 10px; font-size: 18px; background-color: #357296; color: white; cursor: pointer;" onclick="window.open('https://www.udemy.com/course/pysimplegui/?couponCode=4FD91A459D56B1029FF8','_blank');">
<button style="margin: 0 auto; display: block; width: 200px; height: 70px; border-radius: 14px; border: none; padding: 10px; font-size: 18px; background-color: #357296; color: white; cursor: pointer;" onclick="window.open('https://www.udemy.com/course/pysimplegui/?couponCode=8D57E54186ADB10C4180','_blank');">
click here to visit course page
</button>
</div>