ok-script 0.0.39__tar.gz → 0.0.41__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.39 → ok-script-0.0.41}/PKG-INFO +1 -1
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/OK.py +3 -2
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/HwndWindow.py +1 -2
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/windows/WindowsGraphicsCaptureMethod.py +11 -2
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/config/Config.py +36 -21
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/App.py +4 -3
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/Communicate.py +1 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/MainWindow.py +14 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/debug/Screenshot.py +11 -2
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/resources.py +367 -369
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/ConfigItemFactory.py +8 -8
- ok-script-0.0.41/ok/gui/tasks/ConfigLabelAndWidget.py +16 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/LabelAndDoubleSpinBox.py +3 -4
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/LabelAndDropDown.py +3 -4
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/LabelAndLineEdit.py +3 -4
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/LabelAndSpinBox.py +3 -4
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/LabelAndSwitchButton.py +3 -4
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/ModifyListItem.py +12 -6
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/TaskCard.py +1 -1
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/save/SaveMethodBase.py +1 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/task/BaseTask.py +11 -1
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/task/ExecutorOperation.py +6 -1
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/task/TaskExecutor.py +1 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/util/exit_event.py +5 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok_script.egg-info/PKG-INFO +1 -1
- {ok-script-0.0.39 → ok-script-0.0.41}/setup.py +1 -1
- ok-script-0.0.39/ok/gui/tasks/ConfigLabelAndWidget.py +0 -10
- {ok-script-0.0.39 → ok-script-0.0.41}/README.md +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/BaseCaptureMethod.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/adb/ADBCaptureMethod.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/adb/DeviceManager.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/adb/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/adb/bin/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/adb/targets.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/adb/vbox.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/windows/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/windows/d3d11.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/windows/dump.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/windows/utils.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/capture/windows/window.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/color/Color.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/color/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/config/InfoDict.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/config/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/feature/Box.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/feature/Feature.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/feature/FeatureSet.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/feature/FindFeature.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/feature/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/MessageWindow.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/TabTitles.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/about/AboutTab.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/about/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/common/OKIcon.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/common/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/common/config.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/common/style_sheet.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/debug/AspectRatioWidget.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/debug/DebugTab.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/debug/FrameWidget.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/debug/InfoWidget.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/debug/LoggerWidget.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/debug/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/i18n/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/i18n/path.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/i18n/update.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/icon/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/icon/icon.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/overlay/OverlayWindow.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/overlay/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/qss/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/settings/SettingTab.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/settings/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/start/SelectCaptureListView.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/start/SelectHwndWindow.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/start/StartCard.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/start/StartTab.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/start/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/LabelAndList.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/LabelAndWidget.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/ModifyListDialog.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/OneTimeTaskTab.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/StartButton.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/TaskOpButton.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/TooltipTableWidget.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/TriggerTaskTab.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/tasks/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/util/Alert.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/util/InitWorker.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/util/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/widget/Card.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/widget/FramelessDialog.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/widget/ListTableWidgetItem.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/widget/NumericTableWidgetItem.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/widget/StatusBar.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/widget/Tab.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/widget/TabWidget.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/widget/UpdateConfigWidgetItem.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/widget/YesNonWidgetItem.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/gui/widget/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/interaction/ADBInteraction.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/interaction/BaseInteraction.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/interaction/Win32Interaction.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/interaction/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/logging/Logger.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/logging/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/ocr/OCR.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/ocr/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Media/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Security/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/Storage/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/Windows/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/delegate.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/export.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/idldsl.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/inspectable.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/roapi.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/types.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/rotypes/winstring.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/save/BlackBarProcessor.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/save/PostProcessor.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/save/SaveByInterval.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/save/SaveByKeyPress.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/save/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/scene/FeatureScene.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/scene/Scene.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/scene/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/stats/StreamStats.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/stats/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/task/OneTimeTask.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/task/TriggerTask.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/task/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/util/__init__.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/util/json.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/util/list.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/util/path.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/util/thread.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/util/win32_process.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok/util/yaml.py +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok_script.egg-info/SOURCES.txt +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok_script.egg-info/dependency_links.txt +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok_script.egg-info/requires.txt +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/ok_script.egg-info/top_level.txt +0 -0
- {ok-script-0.0.39 → ok-script-0.0.41}/setup.cfg +0 -0
|
@@ -34,7 +34,7 @@ class OK:
|
|
|
34
34
|
self.config = config
|
|
35
35
|
self.init_device_manager()
|
|
36
36
|
from ok.gui.debug.Screenshot import Screenshot
|
|
37
|
-
self.screenshot = Screenshot()
|
|
37
|
+
self.screenshot = Screenshot(self.exit_event)
|
|
38
38
|
if config.get("use_gui"):
|
|
39
39
|
from ok.gui.App import App
|
|
40
40
|
self.app = App(config, self.exit_event)
|
|
@@ -123,7 +123,8 @@ class OK:
|
|
|
123
123
|
def quit(self):
|
|
124
124
|
logger.debug('quit app')
|
|
125
125
|
self.exit_event.set()
|
|
126
|
-
self.device_manager
|
|
126
|
+
if self.device_manager is not None:
|
|
127
|
+
self.device_manager.stop()
|
|
127
128
|
if self.app:
|
|
128
129
|
self.app.quit()
|
|
129
130
|
|
|
@@ -11,7 +11,6 @@ from win32 import win32gui
|
|
|
11
11
|
from ok.capture.windows.window import is_foreground_window, get_window_bounds
|
|
12
12
|
from ok.gui.Communicate import communicate
|
|
13
13
|
from ok.logging.Logger import get_logger
|
|
14
|
-
from ok.util.exit_event import ExitEvent
|
|
15
14
|
|
|
16
15
|
logger = get_logger(__name__)
|
|
17
16
|
|
|
@@ -41,7 +40,7 @@ class HwndWindow:
|
|
|
41
40
|
super().__init__()
|
|
42
41
|
self.app_exit_event = exit_event
|
|
43
42
|
self.exe_name = exe_name
|
|
44
|
-
self.stop_event =
|
|
43
|
+
self.stop_event = threading.Event()
|
|
45
44
|
self.update_title_re(title)
|
|
46
45
|
self.visible = False
|
|
47
46
|
self.update_frame_size(frame_width, frame_height)
|
|
@@ -32,7 +32,7 @@ class WindowsGraphicsCaptureMethod(BaseCaptureMethod):
|
|
|
32
32
|
description = "fast, most compatible, capped at 60fps"
|
|
33
33
|
last_frame = None
|
|
34
34
|
last_frame_time = 0
|
|
35
|
-
|
|
35
|
+
_hwnd_window: HwndWindow = None
|
|
36
36
|
frame_pool = None
|
|
37
37
|
item = None
|
|
38
38
|
session = None
|
|
@@ -42,7 +42,7 @@ class WindowsGraphicsCaptureMethod(BaseCaptureMethod):
|
|
|
42
42
|
|
|
43
43
|
def __init__(self, hwnd_window: HwndWindow):
|
|
44
44
|
super().__init__()
|
|
45
|
-
self.
|
|
45
|
+
self._hwnd_window = hwnd_window
|
|
46
46
|
self.start_or_stop()
|
|
47
47
|
|
|
48
48
|
def frame_arrived_callback(self, x, y):
|
|
@@ -108,6 +108,15 @@ class WindowsGraphicsCaptureMethod(BaseCaptureMethod):
|
|
|
108
108
|
return self.get_frame()
|
|
109
109
|
self.last_frame = img
|
|
110
110
|
|
|
111
|
+
@property
|
|
112
|
+
def hwnd_window(self):
|
|
113
|
+
return self._hwnd_window
|
|
114
|
+
|
|
115
|
+
@hwnd_window.setter
|
|
116
|
+
def hwnd_window(self, hwnd_window):
|
|
117
|
+
self._hwnd_window = hwnd_window
|
|
118
|
+
self.start_or_stop()
|
|
119
|
+
|
|
111
120
|
def connected(self):
|
|
112
121
|
return self.hwnd_window is not None and self.hwnd_window.exists
|
|
113
122
|
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
+
from ok.gui.Communicate import communicate
|
|
1
2
|
from ok.util.json import read_json_file, write_json_file
|
|
2
3
|
from ok.util.path import get_path_relative_to_exe
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
class Config:
|
|
6
|
-
def __init__(self, default, folder, name):
|
|
7
|
+
def __init__(self, default, folder, name, validator=None):
|
|
7
8
|
super().__init__()
|
|
8
9
|
self.default = default
|
|
10
|
+
self.validator = validator
|
|
9
11
|
self.config_file = get_path_relative_to_exe(folder, f"{name}.json")
|
|
10
12
|
self.config = read_json_file(self.config_file)
|
|
11
13
|
if self.config is None:
|
|
12
14
|
self.config = default
|
|
13
|
-
elif verify_config(self.config, default):
|
|
15
|
+
elif self.verify_config(self.config, default):
|
|
14
16
|
self.save_file()
|
|
15
17
|
|
|
16
18
|
def save_file(self):
|
|
@@ -60,26 +62,39 @@ class Config:
|
|
|
60
62
|
return len(self.config)
|
|
61
63
|
|
|
62
64
|
def __setitem__(self, key, value):
|
|
63
|
-
self.
|
|
64
|
-
|
|
65
|
+
if self.validate(key, value):
|
|
66
|
+
self.config[key] = value
|
|
67
|
+
self.save_file()
|
|
65
68
|
|
|
66
69
|
def __getitem__(self, key):
|
|
67
70
|
return self.config[key]
|
|
68
71
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
72
|
+
def validate(self, key, value):
|
|
73
|
+
if self.validator is not None:
|
|
74
|
+
valid, message = self.validator(key, value)
|
|
75
|
+
if not valid:
|
|
76
|
+
communicate.config_validation.emit(message)
|
|
77
|
+
return False
|
|
78
|
+
return True
|
|
79
|
+
|
|
80
|
+
def verify_config(self, config, default_config):
|
|
81
|
+
modified = False
|
|
82
|
+
|
|
83
|
+
# Remove entries that do not exist in default_config
|
|
84
|
+
for key in list(config.keys()):
|
|
85
|
+
if key not in default_config:
|
|
86
|
+
del config[key]
|
|
87
|
+
modified = True
|
|
88
|
+
|
|
89
|
+
# Check entries in default_config
|
|
90
|
+
for key, default_value in default_config.items():
|
|
91
|
+
if key not in config or type(config[key]) != type(default_value):
|
|
92
|
+
config[key] = default_value
|
|
93
|
+
modified = True
|
|
94
|
+
elif self.validator is not None:
|
|
95
|
+
valid = self.validate(key, self.config[key])
|
|
96
|
+
if not valid:
|
|
97
|
+
config[key] = default_value
|
|
98
|
+
modified = True
|
|
99
|
+
|
|
100
|
+
return not modified
|
|
@@ -68,9 +68,10 @@ class App:
|
|
|
68
68
|
message_window.show()
|
|
69
69
|
|
|
70
70
|
def show_path_ascii_error(self, path):
|
|
71
|
-
title =
|
|
72
|
-
content =
|
|
73
|
-
|
|
71
|
+
title = QCoreApplication.translate("app", 'Error')
|
|
72
|
+
content = QCoreApplication.translate("app",
|
|
73
|
+
"Install dir {path} must be an English path, move to another path.").format(
|
|
74
|
+
path=path)
|
|
74
75
|
self.show_message_window(title, content)
|
|
75
76
|
|
|
76
77
|
def show_main_window(self):
|
|
@@ -67,6 +67,20 @@ class MainWindow(MSFluentWindow):
|
|
|
67
67
|
|
|
68
68
|
communicate.capture_error.connect(self.capture_error)
|
|
69
69
|
communicate.notification.connect(self.show_notification)
|
|
70
|
+
communicate.config_validation.connect(self.config_validation)
|
|
71
|
+
|
|
72
|
+
def config_validation(self, message):
|
|
73
|
+
title = self.tr('Error')
|
|
74
|
+
InfoBar.error(
|
|
75
|
+
title=title,
|
|
76
|
+
content=message,
|
|
77
|
+
orient=Qt.Horizontal,
|
|
78
|
+
isClosable=True,
|
|
79
|
+
position=InfoBarPosition.TOP,
|
|
80
|
+
duration=5000, # won't disappear automatically
|
|
81
|
+
parent=self.window()
|
|
82
|
+
)
|
|
83
|
+
self.tray.showMessage(title, message)
|
|
70
84
|
|
|
71
85
|
def show_notification(self, message, title=None, error=None):
|
|
72
86
|
bar = InfoBar.error if error else InfoBar.info
|
|
@@ -20,10 +20,9 @@ logger = get_logger(__name__)
|
|
|
20
20
|
|
|
21
21
|
class Screenshot(QObject):
|
|
22
22
|
|
|
23
|
-
def __init__(self):
|
|
23
|
+
def __init__(self, exit_event):
|
|
24
24
|
super().__init__()
|
|
25
25
|
self.queue = []
|
|
26
|
-
self.exit_event = ok.gui.ok.exit_event
|
|
27
26
|
self.time_to_expire = 3
|
|
28
27
|
self.ui_dict = {}
|
|
29
28
|
self.color_map = {
|
|
@@ -31,10 +30,13 @@ class Screenshot(QObject):
|
|
|
31
30
|
"green": QColor(0, 255, 0), # RGB for green
|
|
32
31
|
"blue": QColor(0, 0, 255) # RGB for blue
|
|
33
32
|
}
|
|
33
|
+
self.exit_event = exit_event
|
|
34
34
|
communicate.draw_box.connect(self.draw_box)
|
|
35
35
|
communicate.screenshot.connect(self.screenshot)
|
|
36
36
|
self.click_screenshot_folder = get_path_relative_to_exe(ok.gui.ok.config.get("click_screenshots_folder"))
|
|
37
37
|
self.screenshot_folder = get_path_relative_to_exe(ok.gui.ok.config.get("screenshots_folder"))
|
|
38
|
+
logger.debug(f"init Screenshot {self.screenshot_folder} {self.click_screenshot_folder}")
|
|
39
|
+
print(f"init Screenshot {self.screenshot_folder} {self.screenshot_folder}")
|
|
38
40
|
if self.click_screenshot_folder is not None or self.screenshot_folder is not None:
|
|
39
41
|
self.task_queue = queue.Queue()
|
|
40
42
|
self.exit_event.bind_queue(self.task_queue)
|
|
@@ -106,6 +108,7 @@ class Screenshot(QObject):
|
|
|
106
108
|
pil_image = self.to_pil_image(frame)
|
|
107
109
|
if pil_image is None:
|
|
108
110
|
return
|
|
111
|
+
self.save_pil_image(name + '_original', folder, pil_image)
|
|
109
112
|
# Ensure no fill
|
|
110
113
|
draw = ImageDraw.Draw(pil_image)
|
|
111
114
|
|
|
@@ -127,6 +130,11 @@ class Screenshot(QObject):
|
|
|
127
130
|
# Put text
|
|
128
131
|
draw.text((x, y + height + 8), f"{box.name or key}_{round(box.confidence * 100)}", fill=color,
|
|
129
132
|
font=self.pil_font)
|
|
133
|
+
self.save_pil_image(name + '_boxed', folder, pil_image)
|
|
134
|
+
|
|
135
|
+
def save_pil_image(self, name, folder, pil_image):
|
|
136
|
+
|
|
137
|
+
logger.debug(f'save_pil_image {name}, {folder}')
|
|
130
138
|
now = datetime.now()
|
|
131
139
|
|
|
132
140
|
# Convert to string with milliseconds
|
|
@@ -142,6 +150,7 @@ class Screenshot(QObject):
|
|
|
142
150
|
pil_image.save(os.path.join(folder, f"{time_string}.png"))
|
|
143
151
|
|
|
144
152
|
def stop(self):
|
|
153
|
+
logger.debug(f'stop screenshot')
|
|
145
154
|
if self.task_queue is not None:
|
|
146
155
|
self.task_queue.put(None)
|
|
147
156
|
|