ok-script 2.0.0b1__tar.gz → 2.0.0b2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. {ok_script-2.0.0b1/ok_script.egg-info → ok_script-2.0.0b2}/PKG-INFO +20 -22
  2. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/README.md +13 -0
  3. ok_script-2.0.0b2/diagnostics/qq_trace.py +101 -0
  4. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/__init__.py +17 -1
  5. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/events.py +1 -1
  6. ok_script-2.0.0b2/ok/gui/__init__.py +50 -0
  7. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/task/task.py +11 -0
  8. ok_script-2.0.0b2/ok/task/web.py +162 -0
  9. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/test/TaskTestCase.py +1 -1
  10. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/MainWindow.py +23 -23
  11. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/MessageWindow.py +2 -2
  12. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/about/AboutTab.py +5 -5
  13. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/about/LinksBar.py +3 -3
  14. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/about/VersionCard.py +1 -1
  15. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/debug/DebugTab.py +3 -3
  16. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/debug/OverlayWidget.py +1 -1
  17. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/debug/RunCodeTab.py +1 -1
  18. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/settings/GlobalConfigCard.py +2 -2
  19. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/settings/GlobalConfigTab.py +2 -2
  20. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/settings/SettingTab.py +3 -3
  21. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/start/StartCard.py +2 -2
  22. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/start/StartTab.py +12 -12
  23. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/ConfigCard.py +4 -4
  24. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/ConfigItemFactory.py +11 -11
  25. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/ConfigLabelAndWidget.py +1 -1
  26. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/EditTaskTab.py +17 -17
  27. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndButtons.py +2 -2
  28. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndDoubleSpinBox.py +2 -2
  29. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndDropDown.py +2 -2
  30. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndFileSelector.py +1 -1
  31. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndGlobal.py +2 -2
  32. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndLineEdit.py +2 -2
  33. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndList.py +1 -1
  34. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndMultiSelection.py +2 -2
  35. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndSpinBox.py +2 -2
  36. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndSwitchButton.py +1 -1
  37. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndTextEdit.py +2 -2
  38. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/LabelAndWidget.py +1 -1
  39. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/MarkUpWindow.py +2 -2
  40. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/ModifyListDialog.py +1 -1
  41. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/ModifyListItem.py +3 -3
  42. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/OneTimeTaskTab.py +3 -3
  43. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/RecordScript.py +3 -3
  44. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/ScheduleTaskTab.py +1 -1
  45. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/StartButton.py +2 -2
  46. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/TaskCard.py +3 -3
  47. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/TaskTab.py +4 -4
  48. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/TemplateFactory.py +1 -1
  49. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/TemplateTab.py +13 -13
  50. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/TriggerTaskTab.py +3 -3
  51. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/util/Alert.py +1 -1
  52. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/util/app.py +2 -2
  53. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/BaseLoading.py +1 -1
  54. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/BaseWindow.py +1 -1
  55. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/Card.py +2 -2
  56. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/CustomTab.py +1 -1
  57. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/EmptyCard.py +1 -1
  58. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/ListTableWidgetItem.py +1 -1
  59. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/NumericTableWidgetItem.py +1 -1
  60. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/StatusBar.py +1 -1
  61. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/Tab.py +5 -5
  62. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/YesNonWidgetItem.py +1 -1
  63. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/web/app.py +112 -0
  64. ok_script-2.0.0b2/ok/ui/web/server.py +690 -0
  65. ok_script-2.0.0b2/ok/ui/web/static/app.js +11 -0
  66. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/web/static/chunk-fluent.js +2 -2
  67. ok_script-2.0.0b2/ok/ui/web/static/index.css +1 -0
  68. {ok_script-2.0.0b1 → ok_script-2.0.0b2/ok_script.egg-info}/PKG-INFO +20 -22
  69. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok_script.egg-info/SOURCES.txt +7 -0
  70. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok_script.egg-info/requires.txt +1 -6
  71. ok_script-2.0.0b2/ok_script.egg-info/top_level.txt +6 -0
  72. ok_script-2.0.0b2/pyproject.toml +97 -0
  73. ok_script-2.0.0b2/scripts/generate_web_i18n.py +57 -0
  74. ok_script-2.0.0b2/setup.py +17 -0
  75. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_accent_color.py +1 -1
  76. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_blur.py +1 -1
  77. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_config_card.py +2 -2
  78. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_expand_card_layout.py +1 -1
  79. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_global_config.py +3 -3
  80. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_main_window_notifications.py +3 -3
  81. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_main_window_startup_tab.py +1 -1
  82. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_main_window_system_theme.py +11 -11
  83. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_navigation_state.py +1 -1
  84. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_notifications.py +2 -2
  85. ok_script-2.0.0b2/tests/test_package_metadata.py +27 -0
  86. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_pyappify_startup_update.py +3 -3
  87. ok_script-2.0.0b2/tests/test_qt_legacy_imports.py +12 -0
  88. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_start_controller.py +2 -2
  89. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_task_ui.py +5 -5
  90. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_template_tab.py +2 -2
  91. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_touch_scroll.py +1 -1
  92. ok_script-2.0.0b2/tests/test_web_server.py +511 -0
  93. ok_script-2.0.0b2/tests/test_web_task_tabs.py +143 -0
  94. ok_script-2.0.0b2/tests/test_web_ui_pages.py +224 -0
  95. ok_script-2.0.0b1/ok/gui/__init__.py +0 -10
  96. ok_script-2.0.0b1/ok/ui/web/server.py +0 -154
  97. ok_script-2.0.0b1/ok/ui/web/static/app.js +0 -11
  98. ok_script-2.0.0b1/ok/ui/web/static/index.css +0 -1
  99. ok_script-2.0.0b1/ok_script.egg-info/top_level.txt +0 -1
  100. ok_script-2.0.0b1/setup.py +0 -79
  101. ok_script-2.0.0b1/tests/test_web_server.py +0 -235
  102. ok_script-2.0.0b1/tests/test_web_ui_pages.py +0 -125
  103. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/LICENSE.txt +0 -0
  104. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/MANIFEST.in +0 -0
  105. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/__main__.py +0 -0
  106. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/alas/__init__.py +0 -0
  107. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/alas/emulator_base.py +0 -0
  108. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/alas/emulator_windows.py +0 -0
  109. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/alas/platform_windows.py +0 -0
  110. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/alas/utils.py +0 -0
  111. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/__init__.py +0 -0
  112. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/adb/__init__.py +0 -0
  113. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/adb/deep.py +0 -0
  114. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/adb/minitouch.py +0 -0
  115. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/adb/nemu_ipc.py +0 -0
  116. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/adb/nemu_utils.py +0 -0
  117. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/adb/pool.py +0 -0
  118. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/adb/timer.py +0 -0
  119. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/adb/util.py +0 -0
  120. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/windows/__init__.py +0 -0
  121. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/windows/d3d11.py +0 -0
  122. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/capture/windows/dump.py +0 -0
  123. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/cli.py +0 -0
  124. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/__init__.py +0 -0
  125. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/config_schema.py +0 -0
  126. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/downloads.py +0 -0
  127. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/icons.py +0 -0
  128. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/notifications.py +0 -0
  129. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/screenshot.py +0 -0
  130. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/script_editing.py +0 -0
  131. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/script_packager.py +0 -0
  132. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/script_templates.py +0 -0
  133. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/start_controller.py +0 -0
  134. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/task_manager.py +0 -0
  135. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/template_store.py +0 -0
  136. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/translation.py +0 -0
  137. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/core/ui_config.py +0 -0
  138. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/DeviceManager.py +0 -0
  139. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/__init__.py +0 -0
  140. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture.py +0 -0
  141. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/__init__.py +0 -0
  142. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/adb.py +0 -0
  143. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/base.py +0 -0
  144. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/bitblt.py +0 -0
  145. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/bitblt_utils.py +0 -0
  146. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/browser.py +0 -0
  147. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/desktop_duplication.py +0 -0
  148. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/hwnd_window.py +0 -0
  149. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/image.py +0 -0
  150. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/nemu_ipc.py +0 -0
  151. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/types.py +0 -0
  152. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/update.py +0 -0
  153. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/capture_methods/windows_graphics.py +0 -0
  154. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction.py +0 -0
  155. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/__init__.py +0 -0
  156. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/adb.py +0 -0
  157. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/base.py +0 -0
  158. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/browser.py +0 -0
  159. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/do_nothing.py +0 -0
  160. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/foreground_post_message.py +0 -0
  161. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/genshin.py +0 -0
  162. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/keys.py +0 -0
  163. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/post_message.py +0 -0
  164. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/pydirect.py +0 -0
  165. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/pynput.py +0 -0
  166. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/interaction_methods/swipe.py +0 -0
  167. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/device/intercation.py +0 -0
  168. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/feature/Box.py +0 -0
  169. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/feature/Feature.py +0 -0
  170. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/feature/FeatureSet.py +0 -0
  171. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/feature/__init__.py +0 -0
  172. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/gui/util/pyappify_startup.py +0 -0
  173. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/notification/__init__.py +0 -0
  174. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/notification/manager.py +0 -0
  175. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/notification/messenger_images.py +0 -0
  176. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/notification/pipeline.py +0 -0
  177. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/notification/ppocr.py +0 -0
  178. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/notification/providers.py +0 -0
  179. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/notification/system.py +0 -0
  180. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/notification/windows_messenger.py +0 -0
  181. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ocr/__init__.py +0 -0
  182. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ocr/download_paddle_model.py +0 -0
  183. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
  184. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
  185. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
  186. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
  187. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
  188. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
  189. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
  190. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
  191. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
  192. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Media/__init__.py +0 -0
  193. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
  194. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Security/__init__.py +0 -0
  195. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
  196. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/Storage/__init__.py +0 -0
  197. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/UI/ViewManagement/__init__.py +0 -0
  198. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/UI/__init__.py +0 -0
  199. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/Windows/__init__.py +0 -0
  200. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/__init__.py +0 -0
  201. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/delegate.py +0 -0
  202. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/export.py +0 -0
  203. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/idldsl.py +0 -0
  204. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/inspectable.py +0 -0
  205. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/roapi.py +0 -0
  206. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/types.py +0 -0
  207. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/rotypes/winstring.py +0 -0
  208. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/task/DiagnosisTask.py +0 -0
  209. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/task/TaskExecutor.py +0 -0
  210. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/task/__init__.py +0 -0
  211. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/task/exceptions.py +0 -0
  212. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/test/OKTestRunner.py +0 -0
  213. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/test/RunTests.py +0 -0
  214. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/test/__init__.py +0 -0
  215. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/third_party/__init__.py +0 -0
  216. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/third_party/paperclip.py +0 -0
  217. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/__init__.py +0 -0
  218. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/overlay/__init__.py +0 -0
  219. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/overlay/win32_gdi.py +0 -0
  220. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/Communicate.py +0 -0
  221. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/StartController.py +0 -0
  222. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/TabTitles.py +0 -0
  223. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/__init__.py +0 -0
  224. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/about/HttpTextEdit.py +0 -0
  225. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/about/ProjectCard.py +0 -0
  226. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/about/__init__.py +0 -0
  227. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/common/OKIcon.py +0 -0
  228. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/common/__init__.py +0 -0
  229. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/common/accent_color.py +0 -0
  230. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/common/config.py +0 -0
  231. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/common/design_system.py +0 -0
  232. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/common/icons.py +0 -0
  233. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/common/style_sheet.py +0 -0
  234. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/debug/Screenshot.py +0 -0
  235. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/debug/__init__.py +0 -0
  236. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/events.py +0 -0
  237. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/GettextTranslator.py +0 -0
  238. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/__init__.py +0 -0
  239. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/en_US.qm +0 -0
  240. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/en_US.ts +0 -0
  241. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/es_ES.qm +0 -0
  242. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/es_ES.ts +0 -0
  243. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/ja_JP.qm +0 -0
  244. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/ja_JP.ts +0 -0
  245. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/ko_KR.qm +0 -0
  246. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/ko_KR.ts +0 -0
  247. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/path.py +0 -0
  248. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/update.py +0 -0
  249. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/zh_CN.qm +0 -0
  250. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/zh_CN.ts +0 -0
  251. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/zh_TW.qm +0 -0
  252. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/i18n/zh_TW.ts +0 -0
  253. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/overlay/OverlayWindow.py +0 -0
  254. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/overlay/__init__.py +0 -0
  255. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/__init__.py +0 -0
  256. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/dark/card.qss +0 -0
  257. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/dark/discord.svg +0 -0
  258. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/dark/heart.svg +0 -0
  259. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/dark/message_window.qss +0 -0
  260. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/dark/setting_interface.qss +0 -0
  261. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/dark/status_bar.qss +0 -0
  262. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/dark/stop.svg +0 -0
  263. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/dark/tab.qss +0 -0
  264. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/light/card.qss +0 -0
  265. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/light/discord.svg +0 -0
  266. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/light/heart.svg +0 -0
  267. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/light/message_window.qss +0 -0
  268. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/light/setting_interface.qss +0 -0
  269. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/light/status_bar.qss +0 -0
  270. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/light/stop.svg +0 -0
  271. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qss/light/tab.qss +0 -0
  272. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/qt.qrc +0 -0
  273. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/resources.py +0 -0
  274. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/settings/__init__.py +0 -0
  275. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/start/LogWindow.py +0 -0
  276. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/start/SelectCaptureListView.py +0 -0
  277. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/start/SelectInteractionListView.py +0 -0
  278. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/start/__init__.py +0 -0
  279. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/PythonHighlighter.py +0 -0
  280. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/ScriptPackager.py +0 -0
  281. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/TaskManger.py +0 -0
  282. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/TaskOpButton.py +0 -0
  283. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/TooltipTableWidget.py +0 -0
  284. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/tasks/__init__.py +0 -0
  285. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/util/InitWorker.py +0 -0
  286. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/util/__init__.py +0 -0
  287. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/util/download.py +0 -0
  288. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/util/pip_util.py +0 -0
  289. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/util/pyappify_startup.py +0 -0
  290. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/util/touch_scroll.py +0 -0
  291. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/util/windows_thumbnail.py +0 -0
  292. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/ExpandCardLayout.py +0 -0
  293. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/FlowLayout.py +0 -0
  294. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/FramelessDialog.py +0 -0
  295. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/ImageWidget.py +0 -0
  296. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/OkCompactSpinBox.py +0 -0
  297. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/SortingTableWidgetItem.py +0 -0
  298. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/StartLoadingDialog.py +0 -0
  299. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/TabWidget.py +0 -0
  300. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/UpdateConfigWidgetItem.py +0 -0
  301. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/WidgetWithVLabel.py +0 -0
  302. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/qt/widget/__init__.py +0 -0
  303. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/web/__init__.py +0 -0
  304. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/web/static/chunk-react.js +0 -0
  305. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/ui/web/static/index.html +0 -0
  306. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/update/__init__.py +0 -0
  307. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/update/copy_ok_folder.py +0 -0
  308. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/update/inline_ok_requirements.py +0 -0
  309. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/Analytics.py +0 -0
  310. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/GlobalConfig.py +0 -0
  311. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/__init__.py +0 -0
  312. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/blur.py +0 -0
  313. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/clazz.py +0 -0
  314. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/collection.py +0 -0
  315. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/color.py +0 -0
  316. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/config.py +0 -0
  317. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/explorer.py +0 -0
  318. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/file.py +0 -0
  319. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/gpu_driver_settings.py +0 -0
  320. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/handler.py +0 -0
  321. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/i18n.py +0 -0
  322. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/logger.py +0 -0
  323. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/partial_sync_repo.py +0 -0
  324. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/print_hwnd.py +0 -0
  325. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/process.py +0 -0
  326. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/window.py +0 -0
  327. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok/util/windows_schedule.py +0 -0
  328. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok_script.egg-info/dependency_links.txt +0 -0
  329. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok_script.egg-info/entry_points.txt +0 -0
  330. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/ok_script.egg-info/not-zip-safe +0 -0
  331. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/setup.cfg +0 -0
  332. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_app.py +0 -0
  333. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_base_interaction.py +0 -0
  334. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_box.py +0 -0
  335. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_capture_update.py +0 -0
  336. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_cli.py +0 -0
  337. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_core_events.py +0 -0
  338. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_core_ui_services.py +0 -0
  339. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_device_manager.py +0 -0
  340. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_explorer.py +0 -0
  341. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_gpu_driver_settings.py +0 -0
  342. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_headless_imports.py +0 -0
  343. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_inline_ok_requirements.py +0 -0
  344. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_logger.py +0 -0
  345. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_missing_frame.py +0 -0
  346. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_nemu_ipc_capture.py +0 -0
  347. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_ok_mutex.py +0 -0
  348. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_overlay_custom_draw.py +0 -0
  349. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_process.py +0 -0
  350. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_qt_events.py +0 -0
  351. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_runtime_startup.py +0 -0
  352. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_task_executor_queue.py +0 -0
  353. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_translation_fallback.py +0 -0
  354. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_ui_config.py +0 -0
  355. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_web_app.py +0 -0
  356. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_web_i18n.py +0 -0
  357. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_web_ui_tasks.py +0 -0
  358. {ok_script-2.0.0b1 → ok_script-2.0.0b2}/tests/test_windows_graphics_capture.py +0 -0
@@ -1,17 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ok-script
3
- Version: 2.0.0b1
3
+ Version: 2.0.0b2
4
4
  Summary: Automation with Computer Vision for Python
5
- Home-page: https://github.com/ok-oldking/ok-script
6
- Author: ok-oldking
7
- Author-email: firedcto@gmail.com
5
+ Author-email: ok-oldking <firedcto@gmail.com>
6
+ Project-URL: Homepage, https://github.com/ok-oldking/ok-script
7
+ Project-URL: Repository, https://github.com/ok-oldking/ok-script
8
8
  Classifier: Programming Language :: Python :: 3
9
9
  Classifier: Programming Language :: Python :: 3.11
10
10
  Classifier: Programming Language :: Python :: 3.12
11
11
  Classifier: Programming Language :: Python :: 3.13
12
12
  Classifier: Programming Language :: Python :: 3.14
13
13
  Classifier: Intended Audience :: Developers
14
- Classifier: License :: OSI Approved :: MIT License
15
14
  Classifier: Operating System :: Microsoft :: Windows
16
15
  Requires-Python: >=3.11
17
16
  Description-Content-Type: text/markdown
@@ -24,28 +23,14 @@ Requires-Dist: psutil>=6.0.0
24
23
  Requires-Dist: pydirectinput==1.0.4
25
24
  Requires-Dist: pycaw==20240210
26
25
  Requires-Dist: mouse==0.7.1
27
- Provides-Extra: qt
28
- Requires-Dist: PySide6-Fluent-Widgets>=1.8.3; extra == "qt"
29
26
  Provides-Extra: web
30
27
  Requires-Dist: fastapi>=0.115.0; extra == "web"
31
28
  Requires-Dist: uvicorn[standard]>=0.30.0; extra == "web"
32
29
  Requires-Dist: pywebview>=5.4; extra == "web"
33
- Provides-Extra: all
34
- Requires-Dist: PySide6-Fluent-Widgets>=1.8.3; extra == "all"
35
- Requires-Dist: fastapi>=0.115.0; extra == "all"
36
- Requires-Dist: uvicorn[standard]>=0.30.0; extra == "all"
37
- Requires-Dist: pywebview>=5.4; extra == "all"
38
- Dynamic: author
39
- Dynamic: author-email
40
- Dynamic: classifier
41
- Dynamic: description
42
- Dynamic: description-content-type
43
- Dynamic: home-page
30
+ Provides-Extra: qt
31
+ Requires-Dist: PySide6-Fluent-Widgets>=1.8.3; extra == "qt"
32
+ Requires-Dist: pynput>=1.8.1; extra == "qt"
44
33
  Dynamic: license-file
45
- Dynamic: provides-extra
46
- Dynamic: requires-dist
47
- Dynamic: requires-python
48
- Dynamic: summary
49
34
 
50
35
  # ok-script
51
36
 
@@ -82,6 +67,19 @@ ok-script 支持 Python 3.11 及以上版本,推荐使用 Python 3.12。
82
67
  python -m pip install ok-script
83
68
  ```
84
69
 
70
+ 按使用场景安装界面依赖:
71
+
72
+ ```powershell
73
+ python -m pip install "ok-script[qt]"
74
+ python -m pip install "ok-script[web]"
75
+ ```
76
+
77
+ 开发本仓库时,使用 `pyproject.toml` 中的 `default` 依赖组安装完整开发环境:
78
+
79
+ ```powershell
80
+ python -m pip install --editable . --group default
81
+ ```
82
+
85
83
  如果要创建完整的自动化项目,建议从 [`ok-script-app`](https://github.com/ok-oldking/ok-script-app) 模板开始,而不是直接在本仓库中编写业务脚本。
86
84
 
87
85
  ## 文档
@@ -33,6 +33,19 @@ ok-script 支持 Python 3.11 及以上版本,推荐使用 Python 3.12。
33
33
  python -m pip install ok-script
34
34
  ```
35
35
 
36
+ 按使用场景安装界面依赖:
37
+
38
+ ```powershell
39
+ python -m pip install "ok-script[qt]"
40
+ python -m pip install "ok-script[web]"
41
+ ```
42
+
43
+ 开发本仓库时,使用 `pyproject.toml` 中的 `default` 依赖组安装完整开发环境:
44
+
45
+ ```powershell
46
+ python -m pip install --editable . --group default
47
+ ```
48
+
36
49
  如果要创建完整的自动化项目,建议从 [`ok-script-app`](https://github.com/ok-oldking/ok-script-app) 模板开始,而不是直接在本仓库中编写业务脚本。
37
50
 
38
51
  ## 文档
@@ -0,0 +1,101 @@
1
+ """Trace QQ notification navigation without sending a message.
2
+
3
+ Usage: .venv\\Scripts\\python.exe diagnostics\\qq_trace.py [nickname]
4
+ """
5
+ from __future__ import annotations
6
+
7
+ import logging
8
+ import sys
9
+ import time
10
+ from pathlib import Path
11
+
12
+ import cv2
13
+ import numpy as np
14
+ from types import SimpleNamespace
15
+
16
+ sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
17
+ from ok.notification.windows_messenger import MessengerAutomation
18
+
19
+
20
+ OUT = Path(__file__).resolve().parents[1] / "logs" / "qq_trace"
21
+ OUT.mkdir(parents=True, exist_ok=True)
22
+ logging.basicConfig(
23
+ filename=OUT / "trace.log",
24
+ level=logging.INFO,
25
+ format="%(asctime)s.%(msecs)03d %(levelname)s %(message)s",
26
+ datefmt="%Y-%m-%d %H:%M:%S",
27
+ )
28
+ log = logging.getLogger("qq_trace")
29
+
30
+
31
+ def snap(automation: MessengerAutomation, hwnd: int, label: str) -> None:
32
+ try:
33
+ frame = automation._capture(hwnd)
34
+ path = OUT / f"{time.time_ns()}_{label}.png"
35
+ cv2.imwrite(str(path), frame)
36
+ log.info("screenshot label=%s path=%s shape=%s", label, path, frame.shape)
37
+ except Exception:
38
+ log.exception("screenshot_failed label=%s", label)
39
+
40
+
41
+ def main() -> int:
42
+ nickname = (sys.argv[1] if len(sys.argv) > 1 else "文件传输助手").strip()
43
+ log.info("START nickname=%r", nickname)
44
+ automation = MessengerAutomation(
45
+ ("QQ.exe",), SimpleNamespace(), window_titles=("QQ",),
46
+ dismiss_search_after_contact=True, post_activate=False,
47
+ )
48
+ hwnd = automation._find_hwnd()
49
+ log.info("find_hwnd hwnd=%s foreground=%s", hwnd, __import__("win32gui").GetForegroundWindow())
50
+ if not hwnd:
51
+ log.error("QQ window not found")
52
+ return 2
53
+ snap(automation, hwnd, "01_initial")
54
+ if not automation._wait_until_background(hwnd):
55
+ log.warning("wait_until_background returned false")
56
+ return 3
57
+ log.info("background_ready foreground=%s", __import__("win32gui").GetForegroundWindow())
58
+ snap(automation, hwnd, "02_background_ready")
59
+ search_region, contact_region, send_region = automation._layout_regions(hwnd)
60
+ log.info("layout search=%s contact=%s send=%s", search_region, contact_region, send_region)
61
+ search = automation._wait_text(hwnd, {"Search", "搜索"}, region=search_region, timeout=1.5)
62
+ log.info("search_ocr point=%s", search)
63
+ if search is None:
64
+ search = automation._search_field_point(hwnd)
65
+ log.info("search_fallback point=%s", search)
66
+ snap(automation, hwnd, "03_before_search_click")
67
+ target = automation._click(hwnd, search)
68
+ log.info("click search target=%s point=%s", target, search)
69
+ snap(automation, hwnd, "04_after_search_click")
70
+ time.sleep(1)
71
+ automation._clear_text(target)
72
+ log.info("clear search")
73
+ time.sleep(1)
74
+ automation._type_text(target, nickname)
75
+ log.info("type nickname=%r", nickname)
76
+ time.sleep(1)
77
+ snap(automation, hwnd, "05_after_typing")
78
+ contact_hwnd, contact = automation._wait_contact(hwnd, nickname, contact_region, timeout=8)
79
+ log.info("contact_result hwnd=%s point=%s", contact_hwnd, contact)
80
+ if contact is None:
81
+ log.error("contact not found")
82
+ automation._send_key(hwnd, 0x1B)
83
+ snap(automation, hwnd, "06_contact_not_found_escape")
84
+ return 4
85
+ automation._click(contact_hwnd, contact, focus=contact_hwnd == hwnd)
86
+ log.info("click contact target=%s point=%s", contact_hwnd, contact)
87
+ snap(automation, hwnd, "06_after_contact_click")
88
+ time.sleep(1)
89
+ automation._send_key(hwnd, 0x1B)
90
+ log.info("send escape to dismiss search overlay")
91
+ time.sleep(1)
92
+ snap(automation, hwnd, "07_after_escape")
93
+ send_box = automation._wait_text(hwnd, {"Send", "发送"}, region=send_region, timeout=3)
94
+ log.info("send_box=%s (dry-run; no message sent)", send_box)
95
+ snap(automation, hwnd, "08_final_dry_run")
96
+ log.info("END")
97
+ return 0
98
+
99
+
100
+ if __name__ == "__main__":
101
+ raise SystemExit(main())
@@ -66,6 +66,7 @@ if TYPE_CHECKING:
66
66
  WaitFailedException,
67
67
  )
68
68
  from ok.task.task import BaseTask, FindFeature, OCR, TriggerTask
69
+ from ok.task.web import WebCustomTab, WebTabConfig, task_tab_action, task_tab_query
69
70
  from ok.util.Analytics import Analytics
70
71
  from ok.util.GlobalConfig import (GlobalConfig, register_app_launcher_options,
71
72
  register_basic_options, register_notification_options)
@@ -131,6 +132,10 @@ _LAZY_IMPORTS = {
131
132
  'DiagnosisTask': ('ok.task.DiagnosisTask', 'DiagnosisTask'),
132
133
  'BaseTask': ('ok.task.task', 'BaseTask'),
133
134
  'TriggerTask': ('ok.task.task', 'TriggerTask'),
135
+ 'WebTabConfig': ('ok.task.web', 'WebTabConfig'),
136
+ 'WebCustomTab': ('ok.task.web', 'WebCustomTab'),
137
+ 'task_tab_action': ('ok.task.web', 'task_tab_action'),
138
+ 'task_tab_query': ('ok.task.web', 'task_tab_query'),
134
139
  'FindFeature': ('ok.task.task', 'FindFeature'),
135
140
  'OCR': ('ok.task.task', 'OCR'),
136
141
  'Feature': ('ok.feature.Feature', 'Feature'),
@@ -947,13 +952,24 @@ class OK:
947
952
  config_folder=self.config.get("config_folder"), debug=self.debug,
948
953
  global_config=self.global_config, ocr_target_height=ocr_target_height,
949
954
  config=self.config)
955
+ onetime_tasks = list(self.config.get('onetime_tasks', []))
956
+ ui_config = resolve_ui_config(self.config)
957
+ if ((ui_config is not None and ui_config["type"] == "web")
958
+ or self.config.get("web_runtime", False)):
959
+ from ok.task.web import configured_web_custom_tabs
960
+ existing = {tuple(task[:2]) for task in onetime_tasks
961
+ if isinstance(task, (list, tuple)) and len(task) >= 2}
962
+ for web_task in configured_web_custom_tabs(self.config.get('web_tabs', [])):
963
+ if tuple(web_task) not in existing:
964
+ onetime_tasks.append(web_task)
965
+ existing.add(tuple(web_task))
950
966
  if self.should_init_task_manager_headless():
951
967
  from ok.core.task_manager import TaskManager
952
968
  else:
953
969
  from ok.ui.qt.tasks.TaskManger import TaskManager
954
970
  task_app = self.headless_app if self.should_init_task_manager_headless() else self.app
955
971
  og.task_manager = TaskManager(task_executor=self.task_executor, app=task_app,
956
- onetime_tasks=self.config.get('onetime_tasks', []),
972
+ onetime_tasks=onetime_tasks,
957
973
  trigger_tasks=self.config.get('trigger_tasks', []),
958
974
  scene=self.config.get('scene'))
959
975
  og.executor = self.task_executor
@@ -80,7 +80,7 @@ class EventBus:
80
80
  "blur_overlay", "clear_blur_overlay", "adb_devices",
81
81
  "config_validation", "tab", "capture_error", "starting_emulator",
82
82
  "quit", "start_success", "act", "copyright", "global_config",
83
- "restart_admin",
83
+ "restart_admin", "task_tab",
84
84
  )
85
85
 
86
86
  def __init__(self):
@@ -0,0 +1,50 @@
1
+ """Compatibility namespace for the Qt UI moved to :mod:`ok.ui.qt`.
2
+
3
+ New code should import ``ok.ui.qt``. Existing ``ok.gui`` imports are redirected
4
+ to the same module objects so classes are not defined twice under the legacy
5
+ and current package names.
6
+ """
7
+
8
+ from importlib import import_module
9
+ from importlib.abc import Loader, MetaPathFinder
10
+ from importlib.util import find_spec, spec_from_loader
11
+ from pathlib import Path
12
+ import sys
13
+
14
+
15
+ class _QtAliasLoader(Loader):
16
+ def __init__(self, alias_name, target_name):
17
+ self.alias_name = alias_name
18
+ self.target_name = target_name
19
+
20
+ def create_module(self, spec):
21
+ return import_module(self.target_name)
22
+
23
+ def exec_module(self, module):
24
+ sys.modules[self.alias_name] = module
25
+
26
+
27
+ class _QtAliasFinder(MetaPathFinder):
28
+ legacy_prefix = f"{__name__}."
29
+ current_prefix = "ok.ui.qt."
30
+
31
+ def find_spec(self, fullname, path=None, target=None):
32
+ if not fullname.startswith(self.legacy_prefix):
33
+ return None
34
+ target_name = self.current_prefix + fullname[len(self.legacy_prefix):]
35
+ target_spec = find_spec(target_name)
36
+ if target_spec is None:
37
+ return None
38
+ return spec_from_loader(
39
+ fullname,
40
+ _QtAliasLoader(fullname, target_name),
41
+ origin=target_spec.origin,
42
+ is_package=target_spec.submodule_search_locations is not None,
43
+ )
44
+
45
+
46
+ if not any(isinstance(finder, _QtAliasFinder) for finder in sys.meta_path):
47
+ sys.meta_path.insert(0, _QtAliasFinder())
48
+
49
+ _compat = Path(__file__).resolve().parent
50
+ __path__ = [str(_compat), str(_compat.parent / "ui" / "qt")]
@@ -83,6 +83,10 @@ class ExecutorOperation:
83
83
  """
84
84
  return self.executor.get_task_by_class(cls)
85
85
 
86
+ def get_tasks(self):
87
+ """Return registered tasks without exposing the executor to extensions."""
88
+ return list(self.executor.get_all_tasks())
89
+
86
90
  def box_in_horizontal_center(self, box, off_percent=0.02):
87
91
  """
88
92
  Checks if a box is in the horizontal center.
@@ -1282,6 +1286,13 @@ class BaseTask(OCR):
1282
1286
  communicate.screenshot.emit(frame, f'notification/notification_{index + 1}', False, None)
1283
1287
  communicate.notification.emit(message, title, error, tray, show_tab, params, frames)
1284
1288
 
1289
+ def emit_web_event(self, event, payload=None):
1290
+ """Publish a serializable event to this task's optional browser tab."""
1291
+ tab = getattr(self, "web_tab", None)
1292
+ if tab is None:
1293
+ raise RuntimeError(f"{self.__class__.__name__} does not declare web_tab")
1294
+ communicate.task_tab.emit(tab.id, str(event), payload)
1295
+
1285
1296
  @property
1286
1297
  def enabled(self):
1287
1298
  return self._enabled
@@ -0,0 +1,162 @@
1
+ """Framework-neutral task-backed web tab declarations.
2
+
3
+ This module deliberately has no FastAPI or browser dependencies. Tasks can
4
+ declare a web tab without making the headless or Qt installations depend on
5
+ the web UI stack.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import inspect
11
+ import importlib
12
+ import importlib.util
13
+ import re
14
+ from dataclasses import dataclass
15
+ from pathlib import Path
16
+ from typing import Any, Callable, Literal
17
+
18
+ from ok.task.task import BaseTask
19
+
20
+
21
+ _TAB_ID = re.compile(r"^[a-z0-9]+(?:-[a-z0-9]+)*$")
22
+ _OPERATION_NAME = re.compile(r"^[a-z][a-z0-9_-]*$")
23
+
24
+
25
+ @dataclass(frozen=True)
26
+ class WebTabConfig:
27
+ """Metadata for a browser page owned by a task instance."""
28
+
29
+ id: str
30
+ name: str
31
+ asset_dir: str | Path
32
+ entrypoint: str = "index.js"
33
+ icon: str = "code"
34
+ position: Literal["scroll", "bottom"] = "scroll"
35
+ add_after_default_tabs: bool = True
36
+ task_controls: bool = True
37
+
38
+ def __post_init__(self) -> None:
39
+ if not _TAB_ID.fullmatch(self.id):
40
+ raise ValueError(
41
+ "WebTabConfig id must contain lowercase letters, digits, and single hyphens"
42
+ )
43
+ if not self.name.strip():
44
+ raise ValueError("WebTabConfig name is required")
45
+ if self.position not in {"scroll", "bottom"}:
46
+ raise ValueError(f"Unsupported WebTabConfig position: {self.position}")
47
+ entrypoint = Path(self.entrypoint)
48
+ if entrypoint.is_absolute() or ".." in entrypoint.parts:
49
+ raise ValueError("WebTabConfig entrypoint must stay inside asset_dir")
50
+
51
+ @property
52
+ def resolved_asset_dir(self) -> Path:
53
+ return Path(self.asset_dir).resolve()
54
+
55
+ @property
56
+ def resolved_entrypoint(self) -> Path:
57
+ return (self.resolved_asset_dir / self.entrypoint).resolve()
58
+
59
+
60
+ def _task_tab_operation(kind: Literal["query", "action"], name: str):
61
+ if not _OPERATION_NAME.fullmatch(name):
62
+ raise ValueError(f"Invalid task tab operation name: {name}")
63
+
64
+ def decorate(function: Callable[..., Any]) -> Callable[..., Any]:
65
+ setattr(function, "__task_tab_operation__", (kind, name))
66
+ return function
67
+
68
+ return decorate
69
+
70
+
71
+ def task_tab_query(name: str):
72
+ """Expose a read-only, explicitly named task method to its web tab."""
73
+
74
+ return _task_tab_operation("query", name)
75
+
76
+
77
+ def task_tab_action(name: str):
78
+ """Expose a mutating, explicitly named task method to its web tab."""
79
+
80
+ return _task_tab_operation("action", name)
81
+
82
+
83
+ def task_tab_operations(task: BaseTask) -> dict[tuple[str, str], Callable[..., Any]]:
84
+ """Return only methods explicitly allowlisted with the decorators above."""
85
+
86
+ operations: dict[tuple[str, str], Callable[..., Any]] = {}
87
+ # Static inspection is important here. BaseTask exposes properties such as
88
+ # ``frame`` whose getters wait for device capture; evaluating every member
89
+ # during web startup can therefore block before the server/window opens.
90
+ for attribute_name, descriptor in inspect.getmembers_static(task):
91
+ function = descriptor
92
+ if isinstance(function, (staticmethod, classmethod)):
93
+ function = function.__func__
94
+ function = getattr(function, "__func__", function)
95
+ operation = getattr(function, "__task_tab_operation__", None)
96
+ if operation is None:
97
+ continue
98
+ method = getattr(task, attribute_name)
99
+ if operation in operations:
100
+ raise ValueError(
101
+ f"Duplicate task tab operation {operation[0]}/{operation[1]} "
102
+ f"on {task.__class__.__name__}"
103
+ )
104
+ operations[operation] = method
105
+ return operations
106
+
107
+
108
+ def call_task_tab_operation(
109
+ task: BaseTask,
110
+ kind: Literal["query", "action"],
111
+ name: str,
112
+ payload: dict[str, Any] | None = None,
113
+ ) -> Any:
114
+ """Invoke one allowlisted operation with either zero args or one payload."""
115
+
116
+ method = task_tab_operations(task).get((kind, name))
117
+ if method is None:
118
+ raise ValueError(f"Unknown task tab {kind}: {name}")
119
+ parameters = list(inspect.signature(method).parameters.values())
120
+ if not parameters:
121
+ return method()
122
+ if len(parameters) == 1:
123
+ return method(payload or {})
124
+ raise TypeError(
125
+ f"Task tab operation {task.__class__.__name__}.{method.__name__} "
126
+ "must accept zero arguments or one payload argument"
127
+ )
128
+
129
+
130
+ class WebCustomTab(BaseTask):
131
+ """A non-runnable task-shaped service that owns a browser-only page."""
132
+
133
+ def __init__(self, *args, **kwargs):
134
+ super().__init__(*args, **kwargs)
135
+ self.visible = False
136
+ self.support_schedule_task = False
137
+
138
+
139
+ def configured_web_custom_tabs(web_tabs) -> list[list[str]]:
140
+ """Validate task-backed pages from the web-only ``web_tabs`` config."""
141
+
142
+ resolved: list[list[str]] = []
143
+ seen: set[tuple[str, str]] = set()
144
+ for entry in web_tabs or []:
145
+ if not isinstance(entry, (list, tuple)) or len(entry) != 2:
146
+ raise ValueError("Each web_tabs entry must be [module, class_name]")
147
+ task_module, task_class = entry
148
+ if not isinstance(task_module, str) or not isinstance(task_class, str):
149
+ raise TypeError("web_tabs module and class_name must be strings")
150
+ identity = (task_module, task_class)
151
+ if identity in seen:
152
+ continue
153
+ if importlib.util.find_spec(task_module) is None:
154
+ raise ModuleNotFoundError(f"Configured web tab module not found: {task_module}")
155
+ candidate = getattr(importlib.import_module(task_module), task_class, None)
156
+ if not isinstance(candidate, type) or not issubclass(candidate, WebCustomTab):
157
+ raise TypeError(
158
+ f"Configured web tab {task_module}.{task_class} must extend WebCustomTab"
159
+ )
160
+ seen.add(identity)
161
+ resolved.append([task_module, task_class])
162
+ return resolved
@@ -1,7 +1,7 @@
1
1
  import unittest
2
2
 
3
3
  from ok import Logger
4
- from ok.gui.common.config import Language, cfg
4
+ from ok.ui.qt.common.config import Language, cfg
5
5
  from ok.test import init_ok, destroy_ok
6
6
 
7
7
 
@@ -28,13 +28,13 @@ MessageBoxBase.keyPressEvent = _patched_message_box_base_keyPressEvent
28
28
 
29
29
  from ok.util.config import Config
30
30
 
31
- from ok.gui.Communicate import communicate
32
- from ok.gui.common.accent_color import qfluent_theme_source_color
33
- from ok.gui.common.icons import resolve_icon
34
- from ok.gui.util.Alert import alert_error
35
- from ok.gui.util.touch_scroll import enable_touch_scrolling
36
- from ok.gui.util.pyappify_startup import get_startup_version_change
37
- from ok.gui.widget.StartLoadingDialog import StartLoadingDialog
31
+ from ok.ui.qt.Communicate import communicate
32
+ from ok.ui.qt.common.accent_color import qfluent_theme_source_color
33
+ from ok.ui.qt.common.icons import resolve_icon
34
+ from ok.ui.qt.util.Alert import alert_error
35
+ from ok.ui.qt.util.touch_scroll import enable_touch_scrolling
36
+ from ok.ui.qt.util.pyappify_startup import get_startup_version_change
37
+ from ok.ui.qt.widget.StartLoadingDialog import StartLoadingDialog
38
38
  from ok.util.GlobalConfig import basic_options, KILL_LAUNCHER_AFTER_START, NOTIFICATION_OPTION_NAME
39
39
  from ok.util.clazz import init_class_by_name
40
40
  from ok.util.process import restart_as_admin
@@ -72,7 +72,7 @@ class MainWindow(FluentWindow):
72
72
  self.basic_global_config = global_config.get_config(basic_options)
73
73
  self.main_window_config = Config('main_window', {'last_version': 'v0.0.0'})
74
74
  self.exit_event = exit_event
75
- from ok.gui.start.StartTab import StartTab
75
+ from ok.ui.qt.start.StartTab import StartTab
76
76
  self.start_tab = StartTab(config, exit_event)
77
77
  self.onetime_tab = None
78
78
  self.trigger_tab = None
@@ -115,13 +115,13 @@ class MainWindow(FluentWindow):
115
115
  visible_trigger_tasks = [task for task in self.executor.trigger_tasks if getattr(task, 'visible', True)]
116
116
 
117
117
  if len(visible_trigger_tasks) > 0:
118
- from ok.gui.tasks.TriggerTaskTab import TriggerTaskTab
118
+ from ok.ui.qt.tasks.TriggerTaskTab import TriggerTaskTab
119
119
  self.trigger_tab = TriggerTaskTab()
120
120
  self.addSubInterface(self.trigger_tab, FluentIcon.STOP_WATCH, self.tr('Triggers'),
121
121
  position=NavigationItemPosition.SCROLL)
122
122
 
123
123
  if visible_onetime_tasks:
124
- from ok.gui.tasks.OneTimeTaskTab import OneTimeTaskTab
124
+ from ok.ui.qt.tasks.OneTimeTaskTab import OneTimeTaskTab
125
125
  from collections import defaultdict
126
126
 
127
127
  groups = defaultdict(list)
@@ -151,23 +151,23 @@ class MainWindow(FluentWindow):
151
151
  for tab_obj in after_custom_tabs:
152
152
  self.addSubInterface(tab_obj, tab_obj.icon, self.app.tr(tab_obj.name), position=tab_obj.position)
153
153
  if debug:
154
- from ok.gui.debug.DebugTab import DebugTab
154
+ from ok.ui.qt.debug.DebugTab import DebugTab
155
155
  debug_tab = DebugTab(config, exit_event)
156
156
  self.addSubInterface(debug_tab, FluentIcon.DEVELOPER_TOOLS, self.tr('Debug'),
157
157
  position=NavigationItemPosition.BOTTOM)
158
- from ok.gui.debug.RunCodeTab import RunCodeTab
158
+ from ok.ui.qt.debug.RunCodeTab import RunCodeTab
159
159
  run_code_tab = RunCodeTab(config, exit_event)
160
160
  self.addSubInterface(run_code_tab, FluentIcon.COMMAND_PROMPT, self.tr('Run Code'),
161
161
  position=NavigationItemPosition.BOTTOM)
162
162
 
163
163
  if og.task_manager.has_custom:
164
- from ok.gui.tasks.EditTaskTab import EditTaskTab
164
+ from ok.ui.qt.tasks.EditTaskTab import EditTaskTab
165
165
  self.edit_task_tab = EditTaskTab()
166
166
  self.addSubInterface(self.edit_task_tab, FluentIcon.EDIT, self.tr('Script'),
167
167
  position=NavigationItemPosition.SCROLL)
168
168
 
169
169
  if og.task_manager.has_custom or debug:
170
- from ok.gui.tasks.TemplateTab import TemplateTab
170
+ from ok.ui.qt.tasks.TemplateTab import TemplateTab
171
171
  self.template_tab = TemplateTab(config=config)
172
172
  self.addSubInterface(self.template_tab, FluentIcon.PHOTO, self.tr('Templates'),
173
173
  position=NavigationItemPosition.SCROLL)
@@ -179,7 +179,7 @@ class MainWindow(FluentWindow):
179
179
  # 添加计划任务Tab
180
180
  any_support_schedule = any(task.support_schedule_task for task in visible_onetime_tasks)
181
181
  if any_support_schedule:
182
- from ok.gui.tasks.ScheduleTaskTab import ScheduleTaskTab
182
+ from ok.ui.qt.tasks.ScheduleTaskTab import ScheduleTaskTab
183
183
  self.schedule_tab = ScheduleTaskTab(config=self.config)
184
184
  self.addSubInterface(self.schedule_tab, FluentIcon.CALENDAR, self.tr('Schedule'),
185
185
  position=NavigationItemPosition.SCROLL)
@@ -187,7 +187,7 @@ class MainWindow(FluentWindow):
187
187
  notification_tab = None
188
188
  for name, config_obj, option in global_config.get_all_visible_configs():
189
189
  if getattr(option, 'show_at_tab', False):
190
- from ok.gui.settings.GlobalConfigTab import GlobalConfigTab
190
+ from ok.ui.qt.settings.GlobalConfigTab import GlobalConfigTab
191
191
  config_tab = GlobalConfigTab(config_obj, option)
192
192
  self.global_config_tabs.append(config_tab)
193
193
  if name == NOTIFICATION_OPTION_NAME:
@@ -201,12 +201,12 @@ class MainWindow(FluentWindow):
201
201
  self.addSubInterface(notification_tab, FluentIcon.RINGER, self.app.tr(NOTIFICATION_OPTION_NAME),
202
202
  position=NavigationItemPosition.BOTTOM)
203
203
 
204
- from ok.gui.settings.SettingTab import SettingTab
204
+ from ok.ui.qt.settings.SettingTab import SettingTab
205
205
  self.setting_tab = SettingTab()
206
206
  self.addSubInterface(self.setting_tab, FluentIcon.SETTING, self.tr('Settings'),
207
207
  position=NavigationItemPosition.BOTTOM)
208
208
 
209
- from ok.gui.about.AboutTab import AboutTab
209
+ from ok.ui.qt.about.AboutTab import AboutTab
210
210
  self.about_tab = AboutTab(config)
211
211
  self.addSubInterface(self.about_tab, FluentIcon.QUESTION, self.tr('About'),
212
212
  position=NavigationItemPosition.BOTTOM)
@@ -369,7 +369,7 @@ class MainWindow(FluentWindow):
369
369
  def update_imported_tabs(self):
370
370
  """Update navigation tabs for imported scripts."""
371
371
  from ok import og
372
- from ok.gui.tasks.OneTimeTaskTab import OneTimeTaskTab
372
+ from ok.ui.qt.tasks.OneTimeTaskTab import OneTimeTaskTab
373
373
 
374
374
  imported_scripts = og.task_manager.imported_scripts
375
375
 
@@ -617,7 +617,7 @@ class MainWindow(FluentWindow):
617
617
 
618
618
  def show_notification(self, message, title=None, error=False, tray=False, show_tab=None, params=None, images=None):
619
619
  from ok import og
620
- from ok.gui.util.app import show_info_bar
620
+ from ok.ui.qt.util.app import show_info_bar
621
621
  translated_message = QCoreApplication.translate("app", message)
622
622
  if params:
623
623
  translated_message = translated_message.format(**params)
@@ -673,15 +673,15 @@ class MainWindow(FluentWindow):
673
673
  if hasattr(self, 'edit_task_tab'):
674
674
  self.edit_task_tab._do_import(arg)
675
675
  else:
676
- from ok.gui.tasks.ScriptPackager import import_script
676
+ from ok.ui.qt.tasks.ScriptPackager import import_script
677
677
  success, message, import_folder = import_script(arg)
678
678
  if success:
679
679
  from ok import og
680
680
  og.task_manager.load_import_folder(import_folder)
681
- from ok.gui.util.app import show_info_bar
681
+ from ok.ui.qt.util.app import show_info_bar
682
682
  show_info_bar(self.window(), message, title=self.tr('Success'))
683
683
  else:
684
- from ok.gui.util.Alert import alert_error
684
+ from ok.ui.qt.util.Alert import alert_error
685
685
  alert_error(f"Import failed: {message}")
686
686
  except Exception as e:
687
687
  logger.error(f'Error importing .okscript file: {e}')
@@ -3,8 +3,8 @@ from PySide6.QtWidgets import QVBoxLayout, QApplication
3
3
  from qfluentwidgets import BodyLabel, PushButton, SplitTitleBar
4
4
 
5
5
  from ok import Logger, og
6
- from ok.gui.Communicate import communicate
7
- from ok.gui.widget.BaseWindow import BaseWindow
6
+ from ok.ui.qt.Communicate import communicate
7
+ from ok.ui.qt.widget.BaseWindow import BaseWindow
8
8
 
9
9
  logger = Logger.get_logger(__name__)
10
10
 
@@ -2,11 +2,11 @@ from PySide6.QtCore import Qt
2
2
  from PySide6.QtWidgets import QGridLayout, QWidget, QSizePolicy
3
3
  from qfluentwidgets import BodyLabel, SettingCardGroup
4
4
 
5
- from ok.gui.about.ProjectCard import ProjectCard
6
- from ok.gui.about.VersionCard import VersionCard
7
- from ok.gui.util.app import get_localized_app_config
8
- from ok.gui.util.pyappify_startup import get_startup_version_change
9
- from ok.gui.widget.Tab import Tab
5
+ from ok.ui.qt.about.ProjectCard import ProjectCard
6
+ from ok.ui.qt.about.VersionCard import VersionCard
7
+ from ok.ui.qt.util.app import get_localized_app_config
8
+ from ok.ui.qt.util.pyappify_startup import get_startup_version_change
9
+ from ok.ui.qt.widget.Tab import Tab
10
10
  from ok.util.file import get_path_relative_to_exe
11
11
 
12
12