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.
- {ok-script-0.0.36 → ok-script-0.0.38}/PKG-INFO +1 -1
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/OK.py +12 -3
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/BaseCaptureMethod.py +3 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/ADBCaptureMethod.py +14 -20
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/DeviceManager.py +9 -3
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/WindowsGraphicsCaptureMethod.py +20 -6
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/App.py +14 -1
- ok-script-0.0.38/ok/gui/MessageWindow.py +45 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/common/style_sheet.py +1 -6
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/resources.py +429 -338
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/start/StartCard.py +20 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/StatusBar.py +1 -1
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/interaction/ADBInteraction.py +1 -1
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/task/TaskExecutor.py +22 -1
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/path.py +8 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok_script.egg-info/PKG-INFO +1 -1
- {ok-script-0.0.36 → ok-script-0.0.38}/ok_script.egg-info/SOURCES.txt +1 -2
- {ok-script-0.0.36 → ok-script-0.0.38}/setup.py +1 -1
- ok-script-0.0.36/ok/predict/predict.py +0 -45
- ok-script-0.0.36/ok/util/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/README.md +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/HwndWindow.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/bin/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/targets.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/adb/vbox.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/d3d11.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/dump.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/utils.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/capture/windows/window.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/color/Color.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/color/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/config/Config.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/config/InfoDict.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/config/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/feature/Box.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/feature/Feature.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/feature/FeatureSet.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/feature/FindFeature.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/feature/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/Communicate.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/MainWindow.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/TabTitles.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/about/AboutTab.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/about/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/common/OKIcon.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/common/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/common/config.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/AspectRatioWidget.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/DebugTab.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/FrameWidget.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/InfoWidget.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/LoggerWidget.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/Screenshot.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/debug/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/i18n/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/i18n/path.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/i18n/update.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/icon/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/icon/icon.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/overlay/OverlayWindow.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/overlay/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/qss/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/settings/SettingTab.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/settings/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/start/SelectCaptureListView.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/start/SelectHwndWindow.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/start/StartTab.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/start/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/ConfigItemFactory.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/ConfigLabelAndWidget.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndDoubleSpinBox.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndDropDown.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndLineEdit.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndList.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndSpinBox.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndSwitchButton.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/LabelAndWidget.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/ModifyListDialog.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/ModifyListItem.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/OneTimeTaskTab.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/StartButton.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/TaskCard.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/TaskOpButton.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/TooltipTableWidget.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/TriggerTaskTab.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/tasks/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/util/Alert.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/util/InitWorker.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/util/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/Card.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/FramelessDialog.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/ListTableWidgetItem.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/NumericTableWidgetItem.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/Tab.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/TabWidget.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/UpdateConfigWidgetItem.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/YesNonWidgetItem.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/gui/widget/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/interaction/BaseInteraction.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/interaction/Win32Interaction.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/interaction/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/logging/Logger.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/logging/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/ocr/OCR.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/ocr/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
- {ok-script-0.0.36/ok/predict → ok-script-0.0.38/ok/rotypes/Windows/Media}/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
- {ok-script-0.0.36/ok/rotypes/Windows/Media → ok-script-0.0.38/ok/rotypes/Windows/Security}/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
- {ok-script-0.0.36/ok/rotypes/Windows/Security → ok-script-0.0.38/ok/rotypes/Windows/Storage}/__init__.py +0 -0
- {ok-script-0.0.36/ok/rotypes/Windows/Storage → ok-script-0.0.38/ok/rotypes/Windows}/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/delegate.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/export.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/idldsl.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/inspectable.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/roapi.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/types.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/rotypes/winstring.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/save/BlackBarProcessor.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/save/PostProcessor.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/save/SaveByInterval.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/save/SaveByKeyPress.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/save/SaveMethodBase.py +0 -0
- {ok-script-0.0.36/ok/rotypes/Windows → ok-script-0.0.38/ok/save}/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/scene/FeatureScene.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/scene/Scene.py +0 -0
- {ok-script-0.0.36/ok/save → ok-script-0.0.38/ok/scene}/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/stats/StreamStats.py +0 -0
- {ok-script-0.0.36/ok/scene → ok-script-0.0.38/ok/stats}/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/task/BaseTask.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/task/ExecutorOperation.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/task/OneTimeTask.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/task/TriggerTask.py +0 -0
- {ok-script-0.0.36/ok/stats → ok-script-0.0.38/ok/task}/__init__.py +0 -0
- {ok-script-0.0.36/ok/task → ok-script-0.0.38/ok/util}/__init__.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/exit_event.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/json.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/list.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/thread.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/win32_process.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok/util/yaml.py +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok_script.egg-info/dependency_links.txt +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok_script.egg-info/requires.txt +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/ok_script.egg-info/top_level.txt +0 -0
- {ok-script-0.0.36 → ok-script-0.0.38}/setup.cfg +0 -0
|
@@ -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
|
-
|
|
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.
|
|
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,
|
|
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.
|
|
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.
|
|
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(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
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
|
|
259
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|