ok-script 0.0.36__tar.gz → 0.0.38__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 (160) hide show
  1. {ok-script-0.0.36 → ok-script-0.0.38}/PKG-INFO +1 -1
  2. {ok-script-0.0.36 → ok-script-0.0.38}/ok/OK.py +12 -3
  3. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/BaseCaptureMethod.py +3 -0
  4. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/ADBCaptureMethod.py +14 -20
  5. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/DeviceManager.py +9 -3
  6. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/WindowsGraphicsCaptureMethod.py +20 -6
  7. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/App.py +14 -1
  8. ok-script-0.0.38/ok/gui/MessageWindow.py +45 -0
  9. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/common/style_sheet.py +1 -6
  10. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/resources.py +429 -338
  11. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/start/StartCard.py +20 -0
  12. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/StatusBar.py +1 -1
  13. {ok-script-0.0.36 → ok-script-0.0.38}/ok/interaction/ADBInteraction.py +1 -1
  14. {ok-script-0.0.36 → ok-script-0.0.38}/ok/task/TaskExecutor.py +22 -1
  15. {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/path.py +8 -0
  16. {ok-script-0.0.36 → ok-script-0.0.38}/ok_script.egg-info/PKG-INFO +1 -1
  17. {ok-script-0.0.36 → ok-script-0.0.38}/ok_script.egg-info/SOURCES.txt +1 -2
  18. {ok-script-0.0.36 → ok-script-0.0.38}/setup.py +1 -1
  19. ok-script-0.0.36/ok/predict/predict.py +0 -45
  20. ok-script-0.0.36/ok/util/__init__.py +0 -0
  21. {ok-script-0.0.36 → ok-script-0.0.38}/README.md +0 -0
  22. {ok-script-0.0.36 → ok-script-0.0.38}/ok/__init__.py +0 -0
  23. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/HwndWindow.py +0 -0
  24. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/__init__.py +0 -0
  25. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/__init__.py +0 -0
  26. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/bin/__init__.py +0 -0
  27. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/targets.py +0 -0
  28. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/vbox.py +0 -0
  29. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/__init__.py +0 -0
  30. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/d3d11.py +0 -0
  31. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/dump.py +0 -0
  32. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/utils.py +0 -0
  33. {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/window.py +0 -0
  34. {ok-script-0.0.36 → ok-script-0.0.38}/ok/color/Color.py +0 -0
  35. {ok-script-0.0.36 → ok-script-0.0.38}/ok/color/__init__.py +0 -0
  36. {ok-script-0.0.36 → ok-script-0.0.38}/ok/config/Config.py +0 -0
  37. {ok-script-0.0.36 → ok-script-0.0.38}/ok/config/InfoDict.py +0 -0
  38. {ok-script-0.0.36 → ok-script-0.0.38}/ok/config/__init__.py +0 -0
  39. {ok-script-0.0.36 → ok-script-0.0.38}/ok/feature/Box.py +0 -0
  40. {ok-script-0.0.36 → ok-script-0.0.38}/ok/feature/Feature.py +0 -0
  41. {ok-script-0.0.36 → ok-script-0.0.38}/ok/feature/FeatureSet.py +0 -0
  42. {ok-script-0.0.36 → ok-script-0.0.38}/ok/feature/FindFeature.py +0 -0
  43. {ok-script-0.0.36 → ok-script-0.0.38}/ok/feature/__init__.py +0 -0
  44. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/Communicate.py +0 -0
  45. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/MainWindow.py +0 -0
  46. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/TabTitles.py +0 -0
  47. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/__init__.py +0 -0
  48. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/about/AboutTab.py +0 -0
  49. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/about/__init__.py +0 -0
  50. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/common/OKIcon.py +0 -0
  51. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/common/__init__.py +0 -0
  52. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/common/config.py +0 -0
  53. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/AspectRatioWidget.py +0 -0
  54. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/DebugTab.py +0 -0
  55. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/FrameWidget.py +0 -0
  56. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/InfoWidget.py +0 -0
  57. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/LoggerWidget.py +0 -0
  58. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/Screenshot.py +0 -0
  59. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/__init__.py +0 -0
  60. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/i18n/__init__.py +0 -0
  61. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/i18n/path.py +0 -0
  62. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/i18n/update.py +0 -0
  63. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/icon/__init__.py +0 -0
  64. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/icon/icon.py +0 -0
  65. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/overlay/OverlayWindow.py +0 -0
  66. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/overlay/__init__.py +0 -0
  67. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/qss/__init__.py +0 -0
  68. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/settings/SettingTab.py +0 -0
  69. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/settings/__init__.py +0 -0
  70. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/start/SelectCaptureListView.py +0 -0
  71. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/start/SelectHwndWindow.py +0 -0
  72. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/start/StartTab.py +0 -0
  73. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/start/__init__.py +0 -0
  74. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/ConfigItemFactory.py +0 -0
  75. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/ConfigLabelAndWidget.py +0 -0
  76. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndDoubleSpinBox.py +0 -0
  77. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndDropDown.py +0 -0
  78. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndLineEdit.py +0 -0
  79. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndList.py +0 -0
  80. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndSpinBox.py +0 -0
  81. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndSwitchButton.py +0 -0
  82. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndWidget.py +0 -0
  83. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/ModifyListDialog.py +0 -0
  84. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/ModifyListItem.py +0 -0
  85. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/OneTimeTaskTab.py +0 -0
  86. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/StartButton.py +0 -0
  87. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/TaskCard.py +0 -0
  88. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/TaskOpButton.py +0 -0
  89. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/TooltipTableWidget.py +0 -0
  90. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/TriggerTaskTab.py +0 -0
  91. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/__init__.py +0 -0
  92. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/util/Alert.py +0 -0
  93. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/util/InitWorker.py +0 -0
  94. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/util/__init__.py +0 -0
  95. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/Card.py +0 -0
  96. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/FramelessDialog.py +0 -0
  97. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/ListTableWidgetItem.py +0 -0
  98. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/NumericTableWidgetItem.py +0 -0
  99. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/Tab.py +0 -0
  100. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/TabWidget.py +0 -0
  101. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/UpdateConfigWidgetItem.py +0 -0
  102. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/YesNonWidgetItem.py +0 -0
  103. {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/__init__.py +0 -0
  104. {ok-script-0.0.36 → ok-script-0.0.38}/ok/interaction/BaseInteraction.py +0 -0
  105. {ok-script-0.0.36 → ok-script-0.0.38}/ok/interaction/Win32Interaction.py +0 -0
  106. {ok-script-0.0.36 → ok-script-0.0.38}/ok/interaction/__init__.py +0 -0
  107. {ok-script-0.0.36 → ok-script-0.0.38}/ok/logging/Logger.py +0 -0
  108. {ok-script-0.0.36 → ok-script-0.0.38}/ok/logging/__init__.py +0 -0
  109. {ok-script-0.0.36 → ok-script-0.0.38}/ok/ocr/OCR.py +0 -0
  110. {ok-script-0.0.36 → ok-script-0.0.38}/ok/ocr/__init__.py +0 -0
  111. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
  112. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
  113. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
  114. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
  115. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
  116. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
  117. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
  118. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
  119. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
  120. {ok-script-0.0.36/ok/predict → ok-script-0.0.38/ok/rotypes/Windows/Media}/__init__.py +0 -0
  121. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
  122. {ok-script-0.0.36/ok/rotypes/Windows/Media → ok-script-0.0.38/ok/rotypes/Windows/Security}/__init__.py +0 -0
  123. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
  124. {ok-script-0.0.36/ok/rotypes/Windows/Security → ok-script-0.0.38/ok/rotypes/Windows/Storage}/__init__.py +0 -0
  125. {ok-script-0.0.36/ok/rotypes/Windows/Storage → ok-script-0.0.38/ok/rotypes/Windows}/__init__.py +0 -0
  126. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/__init__.py +0 -0
  127. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/delegate.py +0 -0
  128. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/export.py +0 -0
  129. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/idldsl.py +0 -0
  130. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/inspectable.py +0 -0
  131. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/roapi.py +0 -0
  132. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/types.py +0 -0
  133. {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/winstring.py +0 -0
  134. {ok-script-0.0.36 → ok-script-0.0.38}/ok/save/BlackBarProcessor.py +0 -0
  135. {ok-script-0.0.36 → ok-script-0.0.38}/ok/save/PostProcessor.py +0 -0
  136. {ok-script-0.0.36 → ok-script-0.0.38}/ok/save/SaveByInterval.py +0 -0
  137. {ok-script-0.0.36 → ok-script-0.0.38}/ok/save/SaveByKeyPress.py +0 -0
  138. {ok-script-0.0.36 → ok-script-0.0.38}/ok/save/SaveMethodBase.py +0 -0
  139. {ok-script-0.0.36/ok/rotypes/Windows → ok-script-0.0.38/ok/save}/__init__.py +0 -0
  140. {ok-script-0.0.36 → ok-script-0.0.38}/ok/scene/FeatureScene.py +0 -0
  141. {ok-script-0.0.36 → ok-script-0.0.38}/ok/scene/Scene.py +0 -0
  142. {ok-script-0.0.36/ok/save → ok-script-0.0.38/ok/scene}/__init__.py +0 -0
  143. {ok-script-0.0.36 → ok-script-0.0.38}/ok/stats/StreamStats.py +0 -0
  144. {ok-script-0.0.36/ok/scene → ok-script-0.0.38/ok/stats}/__init__.py +0 -0
  145. {ok-script-0.0.36 → ok-script-0.0.38}/ok/task/BaseTask.py +0 -0
  146. {ok-script-0.0.36 → ok-script-0.0.38}/ok/task/ExecutorOperation.py +0 -0
  147. {ok-script-0.0.36 → ok-script-0.0.38}/ok/task/OneTimeTask.py +0 -0
  148. {ok-script-0.0.36 → ok-script-0.0.38}/ok/task/TriggerTask.py +0 -0
  149. {ok-script-0.0.36/ok/stats → ok-script-0.0.38/ok/task}/__init__.py +0 -0
  150. {ok-script-0.0.36/ok/task → ok-script-0.0.38/ok/util}/__init__.py +0 -0
  151. {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/exit_event.py +0 -0
  152. {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/json.py +0 -0
  153. {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/list.py +0 -0
  154. {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/thread.py +0 -0
  155. {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/win32_process.py +0 -0
  156. {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/yaml.py +0 -0
  157. {ok-script-0.0.36 → ok-script-0.0.38}/ok_script.egg-info/dependency_links.txt +0 -0
  158. {ok-script-0.0.36 → ok-script-0.0.38}/ok_script.egg-info/requires.txt +0 -0
  159. {ok-script-0.0.36 → ok-script-0.0.38}/ok_script.egg-info/top_level.txt +0 -0
  160. {ok-script-0.0.36 → ok-script-0.0.38}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ok-script
3
- Version: 0.0.36
3
+ Version: 0.0.38
4
4
  Summary: Automation with Computer Vision for Python
5
5
  Home-page: https://github.com/ok-oldking/ok-script
6
6
  Author: ok-oldking
@@ -8,6 +8,7 @@ from PySide6.QtWidgets import QApplication
8
8
  import ok
9
9
  from ok.logging.Logger import get_logger, config_logger
10
10
  from ok.util.exit_event import ExitEvent
11
+ from ok.util.path import install_path_isascii
11
12
 
12
13
  logger = get_logger(__name__)
13
14
 
@@ -49,8 +50,8 @@ class OK:
49
50
  def start(self):
50
51
  try:
51
52
  if self.config.get("use_gui"):
52
- self.do_init()
53
- self.app.show_main_window()
53
+ if self.do_init():
54
+ self.app.show_main_window()
54
55
  self.app.exec()
55
56
  else:
56
57
  self.task_executor.start()
@@ -80,11 +81,15 @@ class OK:
80
81
  logger.error("start error", e)
81
82
  self.exit_event.set()
82
83
  if self.app:
83
- self.app.quit()
84
+ self.quit()
84
85
 
85
86
  def do_init(self):
86
87
  logger.info(f"initializing {self.__class__.__name__}, config: {self.config}")
87
88
  if self.config.get('ocr'):
89
+ isascii, path = install_path_isascii()
90
+ if not isascii:
91
+ self.app.show_path_ascii_error(path)
92
+ return False
88
93
  from rapidocr_openvino import RapidOCR
89
94
  self.ocr = RapidOCR()
90
95
 
@@ -109,6 +114,8 @@ class OK:
109
114
  if self.app:
110
115
  ok.gui.executor = self.task_executor
111
116
 
117
+ return True
118
+
112
119
  def wait_task(self):
113
120
  while not self.exit_event.is_set():
114
121
  time.sleep(1)
@@ -117,6 +124,8 @@ class OK:
117
124
  logger.debug('quit app')
118
125
  self.exit_event.set()
119
126
  self.device_manager.stop()
127
+ if self.app:
128
+ self.app.quit()
120
129
 
121
130
  def init_device_manager(self):
122
131
  if self.device_manager is None:
@@ -1,8 +1,10 @@
1
1
  import numpy as np
2
2
 
3
+
3
4
  class CaptureException(Exception):
4
5
  pass
5
6
 
7
+
6
8
  class BaseCaptureMethod:
7
9
  name = "None"
8
10
  description = ""
@@ -13,6 +15,7 @@ class BaseCaptureMethod:
13
15
  right_cut = 0
14
16
  width = 0
15
17
  height = 0
18
+ _size = (0, 0)
16
19
 
17
20
  def __init__(self):
18
21
  # Some capture methods don't need an initialization process
@@ -1,7 +1,6 @@
1
1
  # original https://github.com/Toufool/AutoSplit/blob/master/src/capture_method/WindowsGraphicsCaptureMethod.py
2
2
  import cv2
3
3
  import numpy as np
4
- from adbutils import AdbError
5
4
  from typing_extensions import override
6
5
 
7
6
  from ok.capture.BaseCaptureMethod import BaseCaptureMethod
@@ -14,12 +13,11 @@ class ADBCaptureMethod(BaseCaptureMethod):
14
13
  name = "ADB command line Capture"
15
14
  description = "use the adb screencap command, slow but works when in background/minimized, takes 300ms per frame"
16
15
 
17
- def __init__(self, device, exit_event, width=0, height=0):
16
+ def __init__(self, device_manager, exit_event, width=0, height=0):
18
17
  super().__init__()
19
18
  self.exit_event = exit_event
20
- self._size = (width, height)
21
19
  self._connected = (width != 0 and height != 0)
22
- self.device = device
20
+ self.device_manager = device_manager
23
21
 
24
22
  @property
25
23
  def width(self):
@@ -40,7 +38,7 @@ class ADBCaptureMethod(BaseCaptureMethod):
40
38
  def screencap(self):
41
39
  if self.exit_event.is_set():
42
40
  return None
43
- frame = do_screencap(self.device)
41
+ frame = do_screencap(self.device_manager)
44
42
  if frame is not None:
45
43
  height, width, _ = frame.shape
46
44
  self._connected = True
@@ -50,21 +48,17 @@ class ADBCaptureMethod(BaseCaptureMethod):
50
48
  return frame
51
49
 
52
50
  def connected(self):
53
- if not self._connected and self.device is not None:
51
+ if not self._connected and self.device_manager.device is not None:
54
52
  self.screencap()
55
- return self._connected and self.device is not None
53
+ return self._connected and self.device_manager.device is not None
56
54
 
57
55
 
58
- def do_screencap(device) -> np.ndarray | None:
59
- if device is not None:
60
- try:
61
- png_bytes = device.shell("screencap -p", encoding=None)
62
- if png_bytes is not None and len(png_bytes) > 0:
63
- image_data = np.frombuffer(png_bytes, dtype=np.uint8)
64
- image = cv2.imdecode(image_data, cv2.IMREAD_COLOR)
65
- if image is not None:
66
- return image
67
- else:
68
- logger.error(f"Screencap image decode error, probably disconnected")
69
- except AdbError as e:
70
- logger.error(f"Device {device} error", e)
56
+ def do_screencap(device_manager) -> np.ndarray | None:
57
+ png_bytes = device_manager.shell("screencap -p", encoding=None)
58
+ if png_bytes is not None and len(png_bytes) > 0:
59
+ image_data = np.frombuffer(png_bytes, dtype=np.uint8)
60
+ image = cv2.imdecode(image_data, cv2.IMREAD_COLOR)
61
+ if image is not None:
62
+ return image
63
+ else:
64
+ logger.error(f"Screencap image decode error, probably disconnected")
@@ -2,6 +2,7 @@ import threading
2
2
 
3
3
  import adbutils
4
4
  import win32gui
5
+ from adbutils import AdbError
5
6
 
6
7
  from ok.capture.HwndWindow import HwndWindow, find_hwnd_by_title_and_exe
7
8
  from ok.capture.adb.ADBCaptureMethod import ADBCaptureMethod, do_screencap
@@ -217,7 +218,7 @@ class DeviceManager:
217
218
  elif not isinstance(self.capture_method, ADBCaptureMethod):
218
219
  if self.capture_method is not None:
219
220
  self.capture_method.close()
220
- self.capture_method = ADBCaptureMethod(self._device, self.exit_event, width=width,
221
+ self.capture_method = ADBCaptureMethod(self, self.exit_event, width=width,
221
222
  height=height)
222
223
  self.interaction = ADBBaseInteraction(self, self.capture_method, width, height)
223
224
  if self.debug and hwnd_name:
@@ -255,5 +256,10 @@ class DeviceManager:
255
256
  if device is not None:
256
257
  try:
257
258
  return device.shell(*args, **kwargs)
258
- except Exception as e:
259
- logger.error(f"shell_wrapper error occurred: {e}")
259
+ except AdbError as e:
260
+ addr = self.get_preferred_device()['address']
261
+ self.adb.connect(addr)
262
+ logger.error(f"shell_wrapper error occurred: {e} ,try reconnect {addr}")
263
+ return device.shell(*args, **kwargs)
264
+ else:
265
+ raise Exception('Device is none')
@@ -43,6 +43,7 @@ class WindowsGraphicsCaptureMethod(BaseCaptureMethod):
43
43
  def __init__(self, hwnd_window: HwndWindow):
44
44
  super().__init__()
45
45
  self.hwnd_window = hwnd_window
46
+ self.start_or_stop()
46
47
 
47
48
  def frame_arrived_callback(self, x, y):
48
49
  try:
@@ -180,9 +181,7 @@ class WindowsGraphicsCaptureMethod(BaseCaptureMethod):
180
181
  self.last_frame = None
181
182
  latency = time.time() - self.last_frame_time
182
183
  self.last_frame_time = time.time()
183
- if latency > 1:
184
- logger.warning(f"latency too large return None frame: {latency}")
185
- return None
184
+
186
185
  if frame is not None:
187
186
  x, y = self.hwnd_window.get_top_left_frame_offset()
188
187
  if x > 0 or y > 0:
@@ -194,11 +193,26 @@ class WindowsGraphicsCaptureMethod(BaseCaptureMethod):
194
193
  logger.warning(f"get_frame size <=0 {new_width}x{new_height}")
195
194
  frame = None
196
195
  else:
197
- self.width = new_width
198
- self.height = new_height
196
+ self._size = (new_width, new_height)
199
197
  if frame.shape[2] == 4:
200
198
  frame = frame[:, :, :3]
201
- return frame
199
+ if latency > 1:
200
+ logger.warning(f"latency too large return None frame: {latency}")
201
+ return None
202
+ else:
203
+ return frame
204
+
205
+ @property
206
+ def width(self):
207
+ if self._size[0] == 0:
208
+ self.do_get_frame()
209
+ return self._size[0]
210
+
211
+ @property
212
+ def height(self):
213
+ if self._size[1] == 0:
214
+ self.do_get_frame()
215
+ return self._size[1]
202
216
 
203
217
  def reset_framepool(self, size, reset_device=False):
204
218
  if reset_device:
@@ -9,6 +9,7 @@ from qfluentwidgets import FluentTranslator, qconfig, Theme
9
9
  import ok
10
10
  import ok.gui.resources
11
11
  from ok.gui.MainWindow import MainWindow
12
+ from ok.gui.MessageWindow import MessageWindow
12
13
  from ok.gui.i18n.path import i18n_path
13
14
  from ok.gui.overlay.OverlayWindow import OverlayWindow
14
15
  from ok.logging.Logger import get_logger
@@ -60,9 +61,18 @@ class App:
60
61
  # Calculate half the screen size
61
62
  half_screen_width = size.width() / 2
62
63
  half_screen_height = size.height() / 2
63
-
64
64
  window.move(half_screen_width / 2, half_screen_height / 2)
65
65
 
66
+ def show_message_window(self, title, message):
67
+ message_window = MessageWindow(self.icon, title, message, exit_event=self.exit_event)
68
+ message_window.show()
69
+
70
+ def show_path_ascii_error(self, path):
71
+ title = self.app.tr('Error')
72
+ content = self.app.tr(
73
+ "Install dir ") + path + self.app.tr(" must be an English path, move to another path.")
74
+ self.show_message_window(title, content)
75
+
66
76
  def show_main_window(self):
67
77
  self.main_window = MainWindow(self.icon, self.overlay, self.about, exit_event=self.exit_event)
68
78
  self.main_window.setWindowTitle(f'{self.title} {self.version}') # Set the window title here
@@ -92,3 +102,6 @@ class App:
92
102
 
93
103
  def exec(self):
94
104
  sys.exit(self.app.exec())
105
+
106
+ def quit(self):
107
+ self.app.quit()
@@ -0,0 +1,45 @@
1
+ import sys
2
+
3
+ from PySide6.QtCore import Qt
4
+ from PySide6.QtWidgets import QVBoxLayout
5
+ from qfluentwidgets import BodyLabel, PushButton
6
+ from qframelesswindow import FramelessWindow, StandardTitleBar
7
+
8
+ import ok.gui
9
+ from ok.gui.common.style_sheet import StyleSheet
10
+ from ok.logging.Logger import get_logger
11
+
12
+ logger = get_logger(__name__)
13
+
14
+
15
+ class MessageWindow(FramelessWindow):
16
+ def __init__(self, icon, title, message, exit_event=None):
17
+ super().__init__()
18
+ self.exit_event = exit_event
19
+ self.message = message
20
+ self.title_bar = StandardTitleBar(self)
21
+ self.title_bar.maxBtn.hide()
22
+ self.title_bar.minBtn.hide()
23
+ self.setTitleBar(self.title_bar)
24
+ self.setFixedSize(500, 200)
25
+ self.setWindowTitle(title)
26
+ self.setWindowIcon(icon)
27
+ self.message_label = BodyLabel(message)
28
+ self.message_label.setWordWrap(True)
29
+ self.vBoxLayout = QVBoxLayout(self)
30
+ self.setLayout(self.vBoxLayout)
31
+ self.vBoxLayout.addWidget(self.message_label, 0, Qt.AlignVCenter)
32
+ self.confirm_button = PushButton(self.tr('Confirm'))
33
+ self.vBoxLayout.addWidget(self.confirm_button, 0, Qt.AlignCenter)
34
+ self.confirm_button.clicked.connect(self.quit)
35
+ self.confirm_button.setMaximumWidth(150)
36
+
37
+ StyleSheet.MESSAGE_WINDOW.apply(self)
38
+ self.activateWindow()
39
+
40
+ def closeEvent(self, event):
41
+ ok.gui.ok.quit()
42
+ event.accept()
43
+
44
+ def quit(self):
45
+ ok.gui.ok.quit()
@@ -10,13 +10,8 @@ class StyleSheet(StyleSheetBase, Enum):
10
10
  LINK_CARD = "link_card"
11
11
  CARD = "card"
12
12
  STATUS_BAR = "status_bar"
13
- HOME_INTERFACE = "home_interface"
14
- ICON_INTERFACE = "icon_interface"
15
- VIEW_INTERFACE = "view_interface"
16
- SETTING_INTERFACE = "setting_interface"
17
13
  TAB = "tab"
18
- GALLERY_INTERFACE = "gallery_interface"
19
- NAVIGATION_VIEW_INTERFACE = "navigation_view_interface"
14
+ MESSAGE_WINDOW = "message_window"
20
15
 
21
16
  def path(self, theme=Theme.AUTO):
22
17
  theme = qconfig.theme if theme == Theme.AUTO else theme