diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1971f386..111018be 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: mixed-line-ending args: ["-f", "lf"] @@ -11,12 +11,12 @@ repos: - id: double-quote-string-fixer files: ^(FreeSimpleGUI(?:Qt|Web|Wx)?)/(?!Demo).*\.py - repo: https://github.com/asottile/reorder-python-imports - rev: v3.14.0 + rev: v3.16.0 hooks: - id: reorder-python-imports files: ^(FreeSimpleGUI(?:Qt|Web|Wx)?)/(?!Demo).*\.py -- repo: https://github.com/psf/black - rev: '25.1.0' +- repo: https://github.com/psf/black-pre-commit-mirror + rev: '26.1.0' hooks: - id: black args: @@ -26,7 +26,7 @@ repos: files: ^(FreeSimpleGUI(?:Qt|Web|Wx)?)/(?!Demo).*\.py - repo: https://github.com/pycqa/flake8 - rev: '7.1.2' # pick a git hash / tag to point to + rev: '7.3.0' # pick a git hash / tag to point to hooks: - id: flake8 args: diff --git a/FreeSimpleGUI/__init__.py b/FreeSimpleGUI/__init__.py index 5925f37c..74fe8ec7 100644 --- a/FreeSimpleGUI/__init__.py +++ b/FreeSimpleGUI/__init__.py @@ -36,7 +36,6 @@ from typing import List # noqa from typing import Tuple # noqa - # get the tkinter detailed version tclversion_detailed = tkinter.Tcl().eval('info patchlevel') framework_version = tclversion_detailed @@ -14538,9 +14537,7 @@ def _github_issue_post_make_markdown( #### Project details {} -""".format( - issue_type, operating_system, os_ver, psg_port, python_ver, psg_ver, gui_ver, project_details - ) +""".format(issue_type, operating_system, os_ver, psg_port, python_ver, psg_ver, gui_ver, project_details) body2 = """ @@ -14610,17 +14607,13 @@ def _github_issue_post_make_markdown( body2 += """ ## Watcha Makin? {} -""".format( - str(project_details) - ) +""".format(str(project_details)) if where_found: body2 += """ ## How did you find PySimpleGUI? {} -""".format( - str(where_found) - ) +""".format(str(where_found)) return body + body2 diff --git a/FreeSimpleGUI/elements/column.py b/FreeSimpleGUI/elements/column.py index 605d74f6..dd080a4e 100644 --- a/FreeSimpleGUI/elements/column.py +++ b/FreeSimpleGUI/elements/column.py @@ -388,7 +388,7 @@ def _GetElementAtLocation(self, location): :rtype: (Element) """ - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element diff --git a/FreeSimpleGUI/elements/frame.py b/FreeSimpleGUI/elements/frame.py index 556e5ee3..e2e322fe 100644 --- a/FreeSimpleGUI/elements/frame.py +++ b/FreeSimpleGUI/elements/frame.py @@ -230,7 +230,7 @@ def _GetElementAtLocation(self, location): :rtype: (Element) """ - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element diff --git a/FreeSimpleGUI/elements/tab.py b/FreeSimpleGUI/elements/tab.py index f500dde3..f7532b7b 100644 --- a/FreeSimpleGUI/elements/tab.py +++ b/FreeSimpleGUI/elements/tab.py @@ -282,7 +282,7 @@ def _GetElementAtLocation(self, location): :rtype: (Element) """ - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -540,7 +540,7 @@ def _GetElementAtLocation(self, location): :rtype: (Element) """ - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element diff --git a/FreeSimpleGUI/tray.py b/FreeSimpleGUI/tray.py index d27a824c..4fba69ef 100644 --- a/FreeSimpleGUI/tray.py +++ b/FreeSimpleGUI/tray.py @@ -19,7 +19,6 @@ from FreeSimpleGUI.elements.image import Image from FreeSimpleGUI.window import Window - _tray_icon_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==' _tray_icon_success = b'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAEKAAABCgEWpLzLAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAHJQTFRF////ZsxmbbZJYL9gZrtVar9VZsJcbMRYaMZVasFYaL9XbMFbasRZaMFZacRXa8NYasFaasJaasFZasJaasNZasNYasJYasJZasJZasJZasJZasJZasJYasJZasJZasJZasJZasJaasJZasJZasJZasJZ2IAizQAAACV0Uk5TAAUHCA8YGRobHSwtPEJJUVtghJeYrbDByNjZ2tvj6vLz9fb3/CyrN0oAAADnSURBVDjLjZPbWoUgFIQnbNPBIgNKiwwo5v1fsQvMvUXI5oqPf4DFOgCrhLKjC8GNVgnsJY3nKm9kgTsduVHU3SU/TdxpOp15P7OiuV/PVzk5L3d0ExuachyaTWkAkLFtiBKAqZHPh/yuAYSv8R7XE0l6AVXnwBNJUsE2+GMOzWL8k3OEW7a/q5wOIS9e7t5qnGExvF5Bvlc4w/LEM4Abt+d0S5BpAHD7seMcf7+ZHfclp10TlYZc2y2nOqc6OwruxUWx0rDjNJtyp6HkUW4bJn0VWdf/a7nDpj1u++PBOR694+Ftj/8PKNdnDLn/V8YAAAAASUVORK5CYII=' _tray_icon_halt = b'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMAUExURQAAANswNuMPDO8HBO8FCe0HCu4IBu4IB+oLDeoLDu8JC+wKCu4JDO4LDOwKEe4OEO4OEeUQDewQDe0QDucVEuYcG+ccHOsQFuwWHe4fH/EGAvMEBfMFBvAHBPMGBfEGBvYCAfYDAvcDA/cDBPcDBfUDBvYEAPYEAfYEAvYEA/QGAPQGAfQGAvYEBPUEBvYFB/QGBPQGBfQHB/EFCvIHCPMHCfIHC/IFDfMHDPQGCPQGCfQGCvEIBPIIBfAIB/UIB/QICPYICfoBAPoBAfoBAvsBA/kCAPkCAfkCAvkCA/oBBPkCBPkCBfkCBvgCB/gEAPkEAfgEAvkEA/gGAfkGAvkEBPgEBfkEBv0AAP0AAfwAAvwAA/wCAPwCAfwCAvwCA/wABP0ABfwCBfwEAPwFA/ASD/ESFPAUEvAUE/EXFvAdH+kbIOobIeofIfEfIOcmKOohIukgJOggJesiKuwiKewoLe0tLO0oMOQ3OO43Oew4OfAhIPAhIfAiIPEiI+dDRe9ES+lQTOdSWupSUOhTUehSV+hUVu1QUO1RUe1SV+tTWe5SWOxXWOpYV+pZWelYXexaW+xaXO9aX+lZYeNhYOxjZ+lna+psbOttbehsbupscepucuxtcuxucep3fet7e+p/ffB6gOmKiu2Iie2Sk+2Qle2QluySlOyTleuYmvKFivCOjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIxGNZsAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACVElEQVQ4T22S93PTMBhADQdl791SSsuRARTKKHsn+STZBptAi6zIacous+w9yyxl7z1T1h8ptHLhrrzLD5+/987R2XZElZ/39tZsbGg42NdvF4pqcGMs4XEcozAB/oQeu6wGr5fkAZcKOUIIRgQXR723wgaXt/NSgcwlO1r3oARkATfhbmNMMCnlMZdz5J8RN9fVhglS5JA/pJUOJiYXoShCkz/flheDvpzlBCBmya5KcDG1sMSB+r/VQtG+YoFXlwN0Us4yeBXujPmWCOqNlVwX5zHntLH5iQ420YiqX9pqTZFSCrBGBc+InBUDAsbwLRlMC40fGJT8YLRwfnhY3v6/AUtDc9m5z0tRJBOAvHUaFchdY6+zDzEghHv1tUnrNCaIOw84Q2WQmkeO/Xopj1xFBREFr8ZZjuRhA++PEB+t05ggwBucpbH8i/n5C1ZU0EEEmRZnSMxoIYcarKigA0Cb1zpHAyZnGj21xqICAA9dcvo4UgEdZ41FBZSTzEOn30f6QeE3Vhl0gLN+2RGDzZPMHLHKoAO3MFy+ix4sDxFlvMXfrdNgFezy7qrXPaaJg0u27j5nneKrCjJ4pf4e3m4DVMcjNNNKxWnpo6jtnfnkunExB4GbuGKk5FNanpB1nJCjCsThJPAAJ8lVdSF5sSrklM2ZqmYdiC40G7Dfnhp57ZsQz6c3hylEO6ZoZQJxqiVgbhoQK3T6AIgU4rbjxthAPF6NAwAOAcS+ixlp/WBFJRDi0fj2RtcjWRwif8Qdu/w3EKLcu3/YslnrZzwo24UQQvwFCrp/iM1NnHwAAAAASUVORK5CYII=' diff --git a/FreeSimpleGUI/window.py b/FreeSimpleGUI/window.py index 167b8aee..5eace38f 100644 --- a/FreeSimpleGUI/window.py +++ b/FreeSimpleGUI/window.py @@ -821,7 +821,7 @@ def _GetElementAtLocation(self, location): :rtype: """ - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -2760,7 +2760,7 @@ def timer_get_active_timers(self): @classmethod def _restore_stdout(cls): for item in cls._rerouted_stdout_stack: - (window, element) = item # type: (Window, Element) + window, element = item # type: (Window, Element) if not window.is_closed(): sys.stdout = element break @@ -2772,7 +2772,7 @@ def _restore_stdout(cls): @classmethod def _restore_stderr(cls): for item in cls._rerouted_stderr_stack: - (window, element) = item # type: (Window, Element) + window, element = item # type: (Window, Element) if not window.is_closed(): sys.stderr = element break diff --git a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py index 3ec86102..5a571463 100644 --- a/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py +++ b/FreeSimpleGUIQt/FreeSimpleGUIQt/__init__.py @@ -3320,7 +3320,7 @@ def Layout(self, rows): self.AddRow(*row) def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -3485,7 +3485,7 @@ def Update(self, disabled=None, visible=None): # TODO Disable / enable of tabs return self def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -3619,7 +3619,7 @@ def Layout(self, rows): self.AddRow(*row) def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -3749,7 +3749,7 @@ def __init__( temp_size = (150, 30) if self.Orientation.startswith('h') else (30, 150) elif size[0] is not None and size[0] < 100: temp_size = size[0] * 10, size[1] * 3 - self.Widget = self.QT_Slider = None # type:QSlider + self.Widget = self.QT_Slider = None # type: QSlider super().__init__( ELEM_TYPE_INPUT_SLIDER, @@ -4039,7 +4039,7 @@ def Layout(self, rows): self.AddRow(*row) def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -5196,7 +5196,7 @@ def SetIcon(self, icon=None, pngbase64=None): pass def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -6015,14 +6015,12 @@ def create_style_from_font(font): is_bold_text = 'font-weight : bold;' if is_bold else '' is_underline_text = 'text-decoration: underline;' if is_underline else '' - return textwrap.dedent( - f''' + return textwrap.dedent(f''' {is_underline_text} {is_bold_text} font-family: "{font_name}"; font-size: {font_size}pt; - '''.strip() - ).replace('\n', '') + '''.strip()).replace('\n', '') def set_widget_visiblity(widget, visible): @@ -8757,7 +8755,7 @@ def PackFormIntoFrame(container_elem, containing_frame, toplevel_win): container_elem.QT_QTabWidget.addTab(tab_widget, element.Title) # ------------------------- TabGroup placement element ------------------------- # elif element_type == ELEM_TYPE_TAB_GROUP: - element = element # type:TabGroup + element = element # type: TabGroup element.Widget = element.QT_QTabWidget = qtab = QTabWidget() # === style === diff --git a/FreeSimpleGUIWeb/FreeSimpleGUIWeb/__init__.py b/FreeSimpleGUIWeb/FreeSimpleGUIWeb/__init__.py index c1aabdb8..308ac43a 100644 --- a/FreeSimpleGUIWeb/FreeSimpleGUIWeb/__init__.py +++ b/FreeSimpleGUIWeb/FreeSimpleGUIWeb/__init__.py @@ -22,7 +22,6 @@ import time import pkg_resources - # from typing import List, Any, Union, Tuple, Dict # For doing types in comments. perhaps not required @@ -524,28 +523,24 @@ def Get(self): class TextInput_raw_onkeyup(remi.gui.TextInput): @remi.gui.decorate_set_on_listener('(self, emitter, key, keycode, ctrl, shift, alt)') - @remi.gui.decorate_event_js( - """var params={};params['key']=event.key; + @remi.gui.decorate_event_js("""var params={};params['key']=event.key; params['keycode']=(event.which||event.keyCode); params['ctrl']=event.ctrlKey; params['shift']=event.shiftKey; params['alt']=event.altKey; sendCallbackParam('%(emitter_identifier)s','%(event_name)s',params); - event.stopPropagation();event.preventDefault();return false;""" - ) + event.stopPropagation();event.preventDefault();return false;""") def onkeyup(self, key, keycode, ctrl, shift, alt): return (key, keycode, ctrl, shift, alt) @remi.gui.decorate_set_on_listener('(self, emitter, key, keycode, ctrl, shift, alt)') - @remi.gui.decorate_event_js( - """var params={};params['key']=event.key; + @remi.gui.decorate_event_js("""var params={};params['key']=event.key; params['keycode']=(event.which||event.keyCode); params['ctrl']=event.ctrlKey; params['shift']=event.shiftKey; params['alt']=event.altKey; sendCallbackParam('%(emitter_identifier)s','%(event_name)s',params); - event.stopPropagation();event.preventDefault();return false;""" - ) + event.stopPropagation();event.preventDefault();return false;""") def onkeydown(self, key, keycode, ctrl, shift, alt): return (key, keycode, ctrl, shift, alt) @@ -1992,8 +1987,7 @@ def refresh(self): i = int(time.time() * 1e6) # self.app_instance.execute_javascript(""" if Window.App is not None: - Window.App.execute_javascript( - """ + Window.App.execute_javascript(""" var url = '/%(id)s/get_image_data?update_index=%(frame_index)s'; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); @@ -2004,9 +1998,7 @@ def refresh(self): document.getElementById('%(id)s').src = imageUrl; } xhr.send(); - """ - % {'id': id(self), 'frame_index': i} - ) + """ % {'id': id(self), 'frame_index': i}) def get_image_data(self, update_index): headers = {'Content-type': self.mimetype if self.mimetype else 'application/octet-stream'} @@ -2497,7 +2489,7 @@ def Layout(self, rows): self.AddRow(*row) def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -2618,7 +2610,7 @@ def _Layout(self, rows): # return self def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -2712,7 +2704,7 @@ def _Layout(self, rows): self._AddRow(*row) def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -2882,7 +2874,7 @@ def Layout(self, rows): self.AddRow(*row) def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -3281,7 +3273,7 @@ class Window: stdout_string_io = None stdout_location = None port_number = 6900 - active_windows = [] # type: [Window] + active_windows = [] # type: [Window] App = None # type: remi.App def __init__( @@ -3645,7 +3637,7 @@ def SetIcon(self, icon=None, pngbase64=None): pass def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -5310,7 +5302,7 @@ def BuildResultsForSubform(form, initialize_only, top_level_form): except: value = None elif element.Type == ELEM_TYPE_TABLE: - element = element # type:Table + element = element # type: Table value = [ element.SelectedRow, ] diff --git a/FreeSimpleGUIWx/FreeSimpleGUIWx/__init__.py b/FreeSimpleGUIWx/FreeSimpleGUIWx/__init__.py index 5d50d274..7a26050e 100644 --- a/FreeSimpleGUIWx/FreeSimpleGUIWx/__init__.py +++ b/FreeSimpleGUIWx/FreeSimpleGUIWx/__init__.py @@ -1001,7 +1001,7 @@ def __init__( ''' self.Text = text self.InitialState = default - self.WxCheckbox = None # type:wx.CheckBox + self.WxCheckbox = None # type: wx.CheckBox self.Disabled = disabled self.TextColor = text_color if text_color else DEFAULT_TEXT_COLOR self.ChangeSubmits = change_submits or enable_events @@ -1114,7 +1114,7 @@ def __init__( return def _WxSpinCallback(self, event): - event = event # type:wx.SpinEvent + event = event # type: wx.SpinEvent print(f'spin event {event.GetInt()} {self.WxSpinCtrl.GetValue()}') offset = event.GetInt() self.WxTextCtrl.SetValue(self.Values[offset]) @@ -2360,7 +2360,7 @@ def _Layout(self, rows): self._AddRow(*row) def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -2496,7 +2496,7 @@ def Update(self, disabled=None): # TODO Disable / enable of tabs is not complet return self def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -2587,7 +2587,7 @@ def _Layout(self, rows): self._AddRow(*row) def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -2756,7 +2756,7 @@ def _Layout(self, rows): self._AddRow(*row) def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -3569,7 +3569,7 @@ def SetIcon(self, icon=None, pngbase64=None): pass def _GetElementAtLocation(self, location): - (row_num, col_num) = location + row_num, col_num = location row = self.Rows[row_num] element = row[col_num] return element @@ -3619,7 +3619,7 @@ def autoclose_timer_callback(self, frame): # self.App.ExitMainLoop() def callback_keyboard_char(self, event): - event = event # type:wx.KeyEvent + event = event # type: wx.KeyEvent self.LastButtonClicked = None self.FormRemainedOpen = True if event.ClassName == 'wxMouseEvent': @@ -6025,7 +6025,7 @@ def CharWidthInPixels(): element._reroute_stdout() # ------------------------- INPUT CHECKBOX element ------------------------- # elif element_type == ELEM_TYPE_INPUT_CHECKBOX: - element = element # type:Checkbox + element = element # type: Checkbox element.WxCheckbox = widget = wx.CheckBox(toplevel_form.MasterPanel) if element.Text: widget.SetLabel(element.Text) @@ -6069,7 +6069,7 @@ def CharWidthInPixels(): # ------------------------- INPUT SPINNER element ------------------------- # elif element_type == ELEM_TYPE_INPUT_SPIN: - element = element # type:Spin + element = element # type: Spin ######## First make an Input widget that will be used to display the text ######## style = wx.ALIGN_RIGHT if element.ReadOnly: