pyloid 0.10.2__py3-none-any.whl → 0.11.1__py3-none-any.whl

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/__init__.py CHANGED
@@ -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']
pyloid/pyloid.py CHANGED
@@ -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 QIcon, QKeySequence, QShortcut, QClipboard, QImage, QAction, QPalette, QColor
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('Qt').setLevel(logging.ERROR)
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
- if "vulkan" not in message.lower():
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
- """Quits the application."""
734
- self.close_all_windows()
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
  ###########################################################################################
pyloid/timer.py ADDED
@@ -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
@@ -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.10.2
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/yloid_react_boilerplate)
51
+ [https://github.com/pylonic/pyloid_react_boilerplate](https://github.com/Pyloid/pyloid_react_boilerplate)
52
52
 
53
53
  ### Custom Your Boilerplate 🔨
54
54
 
@@ -0,0 +1,13 @@
1
+ pyloid/__init__.py,sha256=OOPhOKNQVmAM8hnfTeE7lHzxb8LsFNcgegBAvDrA-vY,293
2
+ pyloid/api.py,sha256=whgfvPr1A6iwZ1Ewo-0FnOUNnt1K58c-P7YjzuQHcUM,194
3
+ pyloid/autostart.py,sha256=K7DQYl4LHItvPp0bt1V9WwaaZmVSTeGvadkcwG-KKrI,3899
4
+ pyloid/filewatcher.py,sha256=n8N56D65le5TpsgxXb7z-FO_0lqv4UYD4yGq_UuMrAs,1285
5
+ pyloid/monitor.py,sha256=fqDnZ_7dpxVZLVJ5gCluDRY2USrQ5YL_fw1AnYivhsk,12741
6
+ pyloid/pyloid.py,sha256=Nes00K7AWuYJSDBRNY-RmrN8YVEzkUtr0cxf0UTgokY,41391
7
+ pyloid/timer.py,sha256=1bYhqte3rV77vaeMUkcTgmx2ux7FtCqLCx9lIC2-COg,4360
8
+ pyloid/tray.py,sha256=rXgdkvzGxtie_EIcTSA7fjuta4nJk5THhNkGFcfv5Ew,634
9
+ pyloid/utils.py,sha256=DQerZWU_0o8dHcJ5y3yXf9i5OXn7KQZqU-hVBq3uPUA,711
10
+ pyloid-0.11.1.dist-info/LICENSE,sha256=MTYF-6xpRekyTUglRweWtbfbwBL1I_3Bgfbm_SNOuI8,11525
11
+ pyloid-0.11.1.dist-info/METADATA,sha256=p0W5YjZPS1e0l9KwVJ5-SVIILdF2tdZEviGjhJI_y6Y,6069
12
+ pyloid-0.11.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
13
+ pyloid-0.11.1.dist-info/RECORD,,
@@ -1,12 +0,0 @@
1
- pyloid/__init__.py,sha256=98jn3uaX1hB0aZCmFFLYBIswGmauIBHNYX2ZXQC4KjA,246
2
- pyloid/api.py,sha256=whgfvPr1A6iwZ1Ewo-0FnOUNnt1K58c-P7YjzuQHcUM,194
3
- pyloid/autostart.py,sha256=K7DQYl4LHItvPp0bt1V9WwaaZmVSTeGvadkcwG-KKrI,3899
4
- pyloid/filewatcher.py,sha256=n8N56D65le5TpsgxXb7z-FO_0lqv4UYD4yGq_UuMrAs,1285
5
- pyloid/monitor.py,sha256=fqDnZ_7dpxVZLVJ5gCluDRY2USrQ5YL_fw1AnYivhsk,12741
6
- pyloid/pyloid.py,sha256=s3oES8HVgW53mYxizUzcVIYDNOhMADuEkYKuv5IlBtQ,40459
7
- pyloid/tray.py,sha256=rXgdkvzGxtie_EIcTSA7fjuta4nJk5THhNkGFcfv5Ew,634
8
- pyloid/utils.py,sha256=DQerZWU_0o8dHcJ5y3yXf9i5OXn7KQZqU-hVBq3uPUA,711
9
- pyloid-0.10.2.dist-info/LICENSE,sha256=F96EzotgWhhpnQTW2TcdoqrMDir1jyEo6H915tGQ-QE,11524
10
- pyloid-0.10.2.dist-info/METADATA,sha256=wnzUpr44CzzouCGHgoVKsDVHWnbE1QY1E1tHZ4TpK9Y,6068
11
- pyloid-0.10.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
12
- pyloid-0.10.2.dist-info/RECORD,,