pyloid 0.10.2__tar.gz → 0.11.1__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.
- {pyloid-0.10.2 → pyloid-0.11.1}/LICENSE +1 -1
- {pyloid-0.10.2 → pyloid-0.11.1}/PKG-INFO +2 -2
- {pyloid-0.10.2 → pyloid-0.11.1}/README.md +1 -1
- {pyloid-0.10.2 → pyloid-0.11.1}/pyproject.toml +1 -1
- {pyloid-0.10.2 → pyloid-0.11.1}/src/pyloid/__init__.py +2 -1
- {pyloid-0.10.2 → pyloid-0.11.1}/src/pyloid/pyloid.py +38 -6
- pyloid-0.11.1/src/pyloid/timer.py +123 -0
- {pyloid-0.10.2 → pyloid-0.11.1}/src/pyloid/api.py +0 -0
- {pyloid-0.10.2 → pyloid-0.11.1}/src/pyloid/autostart.py +0 -0
- {pyloid-0.10.2 → pyloid-0.11.1}/src/pyloid/filewatcher.py +0 -0
- {pyloid-0.10.2 → pyloid-0.11.1}/src/pyloid/monitor.py +0 -0
- {pyloid-0.10.2 → pyloid-0.11.1}/src/pyloid/tray.py +0 -0
- {pyloid-0.10.2 → pyloid-0.11.1}/src/pyloid/utils.py +0 -0
@@ -198,4 +198,4 @@ Apache License
|
|
198
198
|
distributed under the License is distributed on an "AS IS" BASIS,
|
199
199
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
200
200
|
See the License for the specific language governing permissions and
|
201
|
-
limitations under the License.
|
201
|
+
limitations under the License.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: pyloid
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.11.1
|
4
4
|
Summary:
|
5
5
|
Author: aesthetics-of-record
|
6
6
|
Author-email: 111675679+aesthetics-of-record@users.noreply.github.com
|
@@ -48,7 +48,7 @@ With Pyloid, you can leverage the full power of Python in your desktop applicati
|
|
48
48
|
|
49
49
|
#### Creating a React + Vite + Pyloid Project ⚛️
|
50
50
|
|
51
|
-
[https://github.com/pylonic/pyloid_react_boilerplate](https://github.com/Pyloid/
|
51
|
+
[https://github.com/pylonic/pyloid_react_boilerplate](https://github.com/Pyloid/pyloid_react_boilerplate)
|
52
52
|
|
53
53
|
### Custom Your Boilerplate 🔨
|
54
54
|
|
@@ -33,7 +33,7 @@ With Pyloid, you can leverage the full power of Python in your desktop applicati
|
|
33
33
|
|
34
34
|
#### Creating a React + Vite + Pyloid Project ⚛️
|
35
35
|
|
36
|
-
[https://github.com/pylonic/pyloid_react_boilerplate](https://github.com/Pyloid/
|
36
|
+
[https://github.com/pylonic/pyloid_react_boilerplate](https://github.com/Pyloid/pyloid_react_boilerplate)
|
37
37
|
|
38
38
|
### Custom Your Boilerplate 🔨
|
39
39
|
|
@@ -2,5 +2,6 @@ from .pyloid import Pyloid
|
|
2
2
|
from .api import PyloidAPI, Bridge
|
3
3
|
from .utils import get_production_path, is_production
|
4
4
|
from .tray import TrayEvent
|
5
|
+
from .timer import PyloidTimer
|
5
6
|
|
6
|
-
__all__ = ['Pyloid', 'PyloidAPI', 'Bridge', 'get_production_path', 'is_production', 'TrayEvent']
|
7
|
+
__all__ = ['Pyloid', 'PyloidAPI', 'Bridge', 'get_production_path', 'is_production', 'TrayEvent', 'PyloidTimer']
|
@@ -8,7 +8,16 @@ from PySide6.QtWidgets import (
|
|
8
8
|
)
|
9
9
|
from PySide6.QtWebEngineWidgets import QWebEngineView
|
10
10
|
from PySide6.QtWebChannel import QWebChannel
|
11
|
-
from PySide6.QtGui import
|
11
|
+
from PySide6.QtGui import (
|
12
|
+
QIcon,
|
13
|
+
QKeySequence,
|
14
|
+
QShortcut,
|
15
|
+
QClipboard,
|
16
|
+
QImage,
|
17
|
+
QAction,
|
18
|
+
QPalette,
|
19
|
+
QColor,
|
20
|
+
)
|
12
21
|
from PySide6.QtCore import Qt, Signal, QUrl, QObject, QTimer
|
13
22
|
from PySide6.QtNetwork import QLocalServer, QLocalSocket
|
14
23
|
from PySide6.QtWebEngineCore import QWebEnginePage, QWebEngineSettings
|
@@ -23,13 +32,14 @@ import json
|
|
23
32
|
from .autostart import AutoStart
|
24
33
|
from .filewatcher import FileWatcher
|
25
34
|
import logging
|
26
|
-
from PySide6.QtCore import QCoreApplication
|
35
|
+
from PySide6.QtCore import QCoreApplication, QtMsgType
|
27
36
|
|
28
37
|
# for linux debug
|
29
38
|
os.environ["QTWEBENGINE_DICTIONARIES_PATH"] = "/"
|
30
39
|
|
31
40
|
# for macos debug
|
32
|
-
logging.getLogger(
|
41
|
+
logging.getLogger("Qt").setLevel(logging.ERROR)
|
42
|
+
|
33
43
|
|
34
44
|
def custom_message_handler(mode, context, message):
|
35
45
|
if not hasattr(custom_message_handler, "vulkan_warning_shown") and (
|
@@ -42,7 +52,13 @@ def custom_message_handler(mode, context, message):
|
|
42
52
|
)
|
43
53
|
os.environ["QT_QUICK_BACKEND"] = "software"
|
44
54
|
custom_message_handler.vulkan_warning_shown = True
|
45
|
-
|
55
|
+
|
56
|
+
if "Autofill.enable failed" in message:
|
57
|
+
print(
|
58
|
+
"\033[93mPyloid Warning: Autofill is not enabled in developer tools.\033[0m"
|
59
|
+
)
|
60
|
+
|
61
|
+
if "vulkan" not in message.lower() and "Autofill.enable failed" not in message:
|
46
62
|
print(message)
|
47
63
|
|
48
64
|
|
@@ -390,6 +406,11 @@ class BrowserWindow:
|
|
390
406
|
self.dev_tools_window.resize(800, 600)
|
391
407
|
self.dev_tools_window.show()
|
392
408
|
|
409
|
+
# Add this line to handle dev tools window closure
|
410
|
+
self.dev_tools_window.closeEvent = lambda event: setattr(
|
411
|
+
self, "dev_tools_window", None
|
412
|
+
)
|
413
|
+
|
393
414
|
def get_window_properties(self):
|
394
415
|
"""Returns the properties of the window."""
|
395
416
|
return {
|
@@ -411,6 +432,14 @@ class BrowserWindow:
|
|
411
432
|
|
412
433
|
def closeEvent(self, event):
|
413
434
|
"""Handles the event when the window is closed."""
|
435
|
+
# Close developer tools if open
|
436
|
+
if hasattr(self, "dev_tools_window") and self.dev_tools_window:
|
437
|
+
self.dev_tools_window.close()
|
438
|
+
self.dev_tools_window = None
|
439
|
+
|
440
|
+
# Solve memory leak issue with web view engine
|
441
|
+
self.web_view.page().deleteLater()
|
442
|
+
self.web_view.deleteLater()
|
414
443
|
self._remove_from_app_windows()
|
415
444
|
event.accept() # Accept the event (allow the window to close)
|
416
445
|
|
@@ -730,8 +759,11 @@ class Pyloid(QApplication):
|
|
730
759
|
window._window.close()
|
731
760
|
|
732
761
|
def quit(self):
|
733
|
-
"""
|
734
|
-
self.
|
762
|
+
"""애플리케이션을 종료합니다."""
|
763
|
+
for window in self.windows:
|
764
|
+
window._window.close()
|
765
|
+
window.web_page.deleteLater()
|
766
|
+
window.web_view.deleteLater()
|
735
767
|
QApplication.quit()
|
736
768
|
|
737
769
|
###########################################################################################
|
@@ -0,0 +1,123 @@
|
|
1
|
+
from PySide6.QtCore import QTimer, QObject
|
2
|
+
|
3
|
+
class PyloidTimer(QObject):
|
4
|
+
def __init__(self):
|
5
|
+
super().__init__()
|
6
|
+
self.timers = {}
|
7
|
+
|
8
|
+
def start_periodic_timer(self, interval, callback):
|
9
|
+
"""
|
10
|
+
주기적으로 실행되는 타이머를 시작합니다.
|
11
|
+
|
12
|
+
:param interval: 밀리초 단위의 간격
|
13
|
+
:param callback: 실행할 콜백 함수
|
14
|
+
:param auto_remove: 타이머 중지 시 자동 삭제 여부
|
15
|
+
:return: 타이머 ID
|
16
|
+
"""
|
17
|
+
return self._create_timer(interval, callback, single_shot=False, auto_remove=False)
|
18
|
+
|
19
|
+
def start_single_shot_timer(self, delay, callback):
|
20
|
+
"""
|
21
|
+
한 번만 실행되는 타이머를 시작합니다.
|
22
|
+
|
23
|
+
:param delay: 밀리초 단위의 지연 시간
|
24
|
+
:param callback: 실행할 콜백 함수
|
25
|
+
:return: 타이머 ID
|
26
|
+
"""
|
27
|
+
return self._create_timer(delay, callback, single_shot=True, auto_remove=True)
|
28
|
+
|
29
|
+
def _create_timer(self, interval, callback, single_shot=False, auto_remove=False):
|
30
|
+
timer = QTimer(self)
|
31
|
+
timer.setInterval(interval)
|
32
|
+
timer.setSingleShot(single_shot)
|
33
|
+
|
34
|
+
if auto_remove or single_shot:
|
35
|
+
timer.timeout.connect(lambda: self._timer_finished(callback, id(timer)))
|
36
|
+
else:
|
37
|
+
timer.timeout.connect(callback)
|
38
|
+
|
39
|
+
timer.start()
|
40
|
+
|
41
|
+
timer_id = id(timer)
|
42
|
+
self.timers[timer_id] = timer
|
43
|
+
return timer_id
|
44
|
+
|
45
|
+
def _timer_finished(self, callback, timer_id):
|
46
|
+
callback()
|
47
|
+
self.stop_timer(timer_id)
|
48
|
+
|
49
|
+
def stop_timer(self, timer_id):
|
50
|
+
"""
|
51
|
+
지정된 ID의 타이머를 중지합니다.
|
52
|
+
|
53
|
+
:param timer_id: 중지할 타이머의 ID
|
54
|
+
"""
|
55
|
+
if timer_id in self.timers:
|
56
|
+
self.timers[timer_id].stop()
|
57
|
+
del self.timers[timer_id]
|
58
|
+
|
59
|
+
def is_timer_active(self, timer_id):
|
60
|
+
"""
|
61
|
+
지정된 ID의 타이머가 활성 상태인지 확인합니다.
|
62
|
+
|
63
|
+
:param timer_id: 확인할 타이머의 ID
|
64
|
+
:return: 타이머가 활성 상태이면 True, 그렇지 않으면 False
|
65
|
+
"""
|
66
|
+
return timer_id in self.timers and self.timers[timer_id].isActive()
|
67
|
+
|
68
|
+
def get_remaining_time(self, timer_id):
|
69
|
+
"""
|
70
|
+
지정된 ID의 타이머의 남은 시간을 반환합니다.
|
71
|
+
|
72
|
+
:param timer_id: 확인할 타이머의 ID
|
73
|
+
:return: 남은 시간 (밀리초), 타이머가 없으면 None
|
74
|
+
"""
|
75
|
+
if timer_id in self.timers:
|
76
|
+
return self.timers[timer_id].remainingTime()
|
77
|
+
return None
|
78
|
+
|
79
|
+
def set_interval(self, timer_id, interval):
|
80
|
+
"""
|
81
|
+
지정된 ID의 타이머의 간격을 설정합니다.
|
82
|
+
|
83
|
+
:param timer_id: 설정할 타이머의 ID
|
84
|
+
:param interval: 새로운 간격 (밀리초)
|
85
|
+
"""
|
86
|
+
if timer_id in self.timers:
|
87
|
+
self.timers[timer_id].setInterval(interval)
|
88
|
+
|
89
|
+
def start_precise_periodic_timer(self, interval, callback):
|
90
|
+
"""
|
91
|
+
정밀한 주기적 타이머를 시작합니다.
|
92
|
+
|
93
|
+
:param interval: 밀리초 단위의 간격
|
94
|
+
:param callback: 실행할 콜백 함수
|
95
|
+
:return: 타이머 ID
|
96
|
+
"""
|
97
|
+
return self._create_timer_with_type(interval, callback, QTimer.TimerType.PreciseTimer)
|
98
|
+
|
99
|
+
def start_coarse_periodic_timer(self, interval, callback):
|
100
|
+
"""
|
101
|
+
덜 정밀한 주기적 타이머를 시작합니다.
|
102
|
+
|
103
|
+
:param interval: 밀리초 단위의 간격
|
104
|
+
:param callback: 실행할 콜백 함수
|
105
|
+
:return: 타이머 ID
|
106
|
+
"""
|
107
|
+
return self._create_timer_with_type(interval, callback, QTimer.TimerType.CoarseTimer)
|
108
|
+
|
109
|
+
def _create_timer_with_type(self, interval, callback, timer_type, auto_remove=False):
|
110
|
+
timer = QTimer(self)
|
111
|
+
timer.setInterval(interval)
|
112
|
+
timer.setTimerType(timer_type)
|
113
|
+
|
114
|
+
if auto_remove:
|
115
|
+
timer.timeout.connect(lambda: self._timer_finished(callback, id(timer)))
|
116
|
+
else:
|
117
|
+
timer.timeout.connect(callback)
|
118
|
+
|
119
|
+
timer.start()
|
120
|
+
|
121
|
+
timer_id = id(timer)
|
122
|
+
self.timers[timer_id] = timer
|
123
|
+
return timer_id
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|