pyloid 0.20.1.dev1__py3-none-any.whl → 0.20.2__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 +7 -7
- pyloid/api.py +104 -104
- pyloid/autostart.py +101 -101
- pyloid/browser_window.py +1915 -1968
- pyloid/builder/__init__.py +80 -80
- pyloid/builder/build_config.schema.json +72 -72
- pyloid/builder/spec.py +246 -246
- pyloid/custom/titlebar.py +116 -116
- pyloid/filewatcher.py +163 -163
- pyloid/js_api/event_api.py +24 -24
- pyloid/js_api/window_api.py +255 -255
- pyloid/monitor.py +921 -921
- pyloid/pyloid.py +1404 -1404
- pyloid/thread_pool.py +500 -500
- pyloid/timer.py +307 -307
- pyloid/tray.py +48 -48
- pyloid/utils.py +122 -122
- {pyloid-0.20.1.dev1.dist-info → pyloid-0.20.2.dist-info}/LICENSE +200 -200
- {pyloid-0.20.1.dev1.dist-info → pyloid-0.20.2.dist-info}/METADATA +4 -2
- pyloid-0.20.2.dist-info/RECORD +21 -0
- {pyloid-0.20.1.dev1.dist-info → pyloid-0.20.2.dist-info}/WHEEL +1 -1
- pyloid-0.20.1.dev1.dist-info/RECORD +0 -21
pyloid/__init__.py
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
from .pyloid import Pyloid
|
2
|
-
from .api import PyloidAPI, Bridge
|
3
|
-
from .utils import get_production_path, is_production
|
4
|
-
from .tray import TrayEvent
|
5
|
-
from .timer import PyloidTimer
|
6
|
-
from .builder import build_from_spec, cleanup_before_build, create_spec_from_json, get_site_packages
|
7
|
-
|
1
|
+
from .pyloid import Pyloid
|
2
|
+
from .api import PyloidAPI, Bridge
|
3
|
+
from .utils import get_production_path, is_production
|
4
|
+
from .tray import TrayEvent
|
5
|
+
from .timer import PyloidTimer
|
6
|
+
from .builder import build_from_spec, cleanup_before_build, create_spec_from_json, get_site_packages
|
7
|
+
|
8
8
|
__all__ = ['Pyloid', 'PyloidAPI', 'Bridge', 'get_production_path', 'is_production', 'TrayEvent', 'PyloidTimer', 'build_from_spec', 'cleanup_before_build', 'create_spec_from_json', 'get_site_packages']
|
pyloid/api.py
CHANGED
@@ -1,104 +1,104 @@
|
|
1
|
-
from PySide6.QtCore import QObject, Slot
|
2
|
-
from typing import TYPE_CHECKING
|
3
|
-
|
4
|
-
if TYPE_CHECKING:
|
5
|
-
from pyloid.pyloid import Pyloid
|
6
|
-
from pyloid.browser_window import BrowserWindow
|
7
|
-
|
8
|
-
|
9
|
-
class PyloidAPI(QObject):
|
10
|
-
"""
|
11
|
-
PyloidAPI class is derived from PySide6's QObject.
|
12
|
-
It enables communication between JavaScript and Python.
|
13
|
-
|
14
|
-
Usage Example
|
15
|
-
-------------
|
16
|
-
(Python)
|
17
|
-
```python
|
18
|
-
from pyloid import Pyloid, PyloidAPI, Bridge
|
19
|
-
|
20
|
-
app = Pyloid("Pyloid-App")
|
21
|
-
|
22
|
-
class CustomAPI(PyloidAPI):
|
23
|
-
@Bridge(str, result=str)
|
24
|
-
def echo(self, message):
|
25
|
-
return f"Message received in Python: {message}"
|
26
|
-
|
27
|
-
# Create main window
|
28
|
-
window = app.create_window(
|
29
|
-
title="Pyloid Browser",
|
30
|
-
js_apis=[CustomAPI()],
|
31
|
-
)
|
32
|
-
|
33
|
-
window.load_file("index.html")
|
34
|
-
|
35
|
-
window.show()
|
36
|
-
window.focus()
|
37
|
-
|
38
|
-
app.run()
|
39
|
-
```
|
40
|
-
---
|
41
|
-
(JavaScript)
|
42
|
-
```javascript
|
43
|
-
document.addEventListener('pyloidReady', async function () {
|
44
|
-
let result = await window.pyloid.CustomAPI.echo('Hello, Pyloid!');
|
45
|
-
console.log(result);
|
46
|
-
});
|
47
|
-
```
|
48
|
-
|
49
|
-
"""
|
50
|
-
|
51
|
-
def __init__(self):
|
52
|
-
super().__init__()
|
53
|
-
self.window_id: str = None
|
54
|
-
self.window: "BrowserWindow" = None
|
55
|
-
self.app: "Pyloid" = None
|
56
|
-
|
57
|
-
|
58
|
-
def Bridge(*args, **kwargs):
|
59
|
-
"""
|
60
|
-
Bridge function creates a slot that can be called from JavaScript.
|
61
|
-
|
62
|
-
Parameters
|
63
|
-
----------
|
64
|
-
*args : tuple
|
65
|
-
Variable length argument list.
|
66
|
-
**kwargs : dict
|
67
|
-
Arbitrary keyword arguments.
|
68
|
-
|
69
|
-
Usage Example
|
70
|
-
-------------
|
71
|
-
(Python)
|
72
|
-
```python
|
73
|
-
from pyloid import Pyloid, PyloidAPI, Bridge
|
74
|
-
|
75
|
-
app = Pyloid("Pyloid-App")
|
76
|
-
|
77
|
-
class CustomAPI(PyloidAPI):
|
78
|
-
@Bridge(str, result=str)
|
79
|
-
def echo(self, message):
|
80
|
-
return f"Message received in Python: {message}"
|
81
|
-
|
82
|
-
# Create main window
|
83
|
-
window = app.create_window(
|
84
|
-
title="Pyloid Browser",
|
85
|
-
js_apis=[CustomAPI()],
|
86
|
-
)
|
87
|
-
|
88
|
-
window.load_file("index.html")
|
89
|
-
|
90
|
-
window.show()
|
91
|
-
window.focus()
|
92
|
-
|
93
|
-
app.run()
|
94
|
-
```
|
95
|
-
---
|
96
|
-
(JavaScript)
|
97
|
-
```javascript
|
98
|
-
document.addEventListener('pyloidReady', async function () {
|
99
|
-
let result = await window.pyloid.CustomAPI.echo('Hello, Pyloid!');
|
100
|
-
console.log(result);
|
101
|
-
});
|
102
|
-
```
|
103
|
-
"""
|
104
|
-
return Slot(*args, **kwargs)
|
1
|
+
from PySide6.QtCore import QObject, Slot
|
2
|
+
from typing import TYPE_CHECKING
|
3
|
+
|
4
|
+
if TYPE_CHECKING:
|
5
|
+
from pyloid.pyloid import Pyloid
|
6
|
+
from pyloid.browser_window import BrowserWindow
|
7
|
+
|
8
|
+
|
9
|
+
class PyloidAPI(QObject):
|
10
|
+
"""
|
11
|
+
PyloidAPI class is derived from PySide6's QObject.
|
12
|
+
It enables communication between JavaScript and Python.
|
13
|
+
|
14
|
+
Usage Example
|
15
|
+
-------------
|
16
|
+
(Python)
|
17
|
+
```python
|
18
|
+
from pyloid import Pyloid, PyloidAPI, Bridge
|
19
|
+
|
20
|
+
app = Pyloid("Pyloid-App")
|
21
|
+
|
22
|
+
class CustomAPI(PyloidAPI):
|
23
|
+
@Bridge(str, result=str)
|
24
|
+
def echo(self, message):
|
25
|
+
return f"Message received in Python: {message}"
|
26
|
+
|
27
|
+
# Create main window
|
28
|
+
window = app.create_window(
|
29
|
+
title="Pyloid Browser",
|
30
|
+
js_apis=[CustomAPI()],
|
31
|
+
)
|
32
|
+
|
33
|
+
window.load_file("index.html")
|
34
|
+
|
35
|
+
window.show()
|
36
|
+
window.focus()
|
37
|
+
|
38
|
+
app.run()
|
39
|
+
```
|
40
|
+
---
|
41
|
+
(JavaScript)
|
42
|
+
```javascript
|
43
|
+
document.addEventListener('pyloidReady', async function () {
|
44
|
+
let result = await window.pyloid.CustomAPI.echo('Hello, Pyloid!');
|
45
|
+
console.log(result);
|
46
|
+
});
|
47
|
+
```
|
48
|
+
|
49
|
+
"""
|
50
|
+
|
51
|
+
def __init__(self):
|
52
|
+
super().__init__()
|
53
|
+
self.window_id: str = None
|
54
|
+
self.window: "BrowserWindow" = None
|
55
|
+
self.app: "Pyloid" = None
|
56
|
+
|
57
|
+
|
58
|
+
def Bridge(*args, **kwargs):
|
59
|
+
"""
|
60
|
+
Bridge function creates a slot that can be called from JavaScript.
|
61
|
+
|
62
|
+
Parameters
|
63
|
+
----------
|
64
|
+
*args : tuple
|
65
|
+
Variable length argument list.
|
66
|
+
**kwargs : dict
|
67
|
+
Arbitrary keyword arguments.
|
68
|
+
|
69
|
+
Usage Example
|
70
|
+
-------------
|
71
|
+
(Python)
|
72
|
+
```python
|
73
|
+
from pyloid import Pyloid, PyloidAPI, Bridge
|
74
|
+
|
75
|
+
app = Pyloid("Pyloid-App")
|
76
|
+
|
77
|
+
class CustomAPI(PyloidAPI):
|
78
|
+
@Bridge(str, result=str)
|
79
|
+
def echo(self, message):
|
80
|
+
return f"Message received in Python: {message}"
|
81
|
+
|
82
|
+
# Create main window
|
83
|
+
window = app.create_window(
|
84
|
+
title="Pyloid Browser",
|
85
|
+
js_apis=[CustomAPI()],
|
86
|
+
)
|
87
|
+
|
88
|
+
window.load_file("index.html")
|
89
|
+
|
90
|
+
window.show()
|
91
|
+
window.focus()
|
92
|
+
|
93
|
+
app.run()
|
94
|
+
```
|
95
|
+
---
|
96
|
+
(JavaScript)
|
97
|
+
```javascript
|
98
|
+
document.addEventListener('pyloidReady', async function () {
|
99
|
+
let result = await window.pyloid.CustomAPI.echo('Hello, Pyloid!');
|
100
|
+
console.log(result);
|
101
|
+
});
|
102
|
+
```
|
103
|
+
"""
|
104
|
+
return Slot(*args, **kwargs)
|
pyloid/autostart.py
CHANGED
@@ -1,101 +1,101 @@
|
|
1
|
-
import sys
|
2
|
-
import os
|
3
|
-
if sys.platform == "win32":
|
4
|
-
import winreg as reg
|
5
|
-
|
6
|
-
class AutoStart:
|
7
|
-
def __init__(self, app_name, app_path):
|
8
|
-
self.app_name = app_name
|
9
|
-
self.app_path = app_path
|
10
|
-
|
11
|
-
def set_auto_start(self, enable: bool):
|
12
|
-
if sys.platform == "win32":
|
13
|
-
self._set_auto_start_windows(enable)
|
14
|
-
elif sys.platform == "darwin":
|
15
|
-
self._set_auto_start_macos(enable)
|
16
|
-
elif sys.platform.startswith("linux"):
|
17
|
-
self._set_auto_start_linux(enable)
|
18
|
-
|
19
|
-
def _set_auto_start_windows(self, enable: bool):
|
20
|
-
key_path = r"Software\Microsoft\Windows\CurrentVersion\Run"
|
21
|
-
try:
|
22
|
-
key = reg.OpenKey(reg.HKEY_CURRENT_USER, key_path, 0, reg.KEY_ALL_ACCESS)
|
23
|
-
if enable:
|
24
|
-
reg.SetValueEx(key, self.app_name, 0, reg.REG_SZ, self.app_path)
|
25
|
-
else:
|
26
|
-
reg.DeleteValue(key, self.app_name)
|
27
|
-
reg.CloseKey(key)
|
28
|
-
return True
|
29
|
-
except WindowsError:
|
30
|
-
return False
|
31
|
-
|
32
|
-
def _set_auto_start_macos(self, enable: bool):
|
33
|
-
plist_path = os.path.expanduser(f"~/Library/LaunchAgents/com.{self.app_name}.plist")
|
34
|
-
plist_content = f"""<?xml version="1.0" encoding="UTF-8"?>
|
35
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
36
|
-
<plist version="1.0">
|
37
|
-
<dict>
|
38
|
-
<key>Label</key>
|
39
|
-
<string>com.{self.app_name}</string>
|
40
|
-
<key>ProgramArguments</key>
|
41
|
-
<array>
|
42
|
-
<string>{self.app_path}</string>
|
43
|
-
</array>
|
44
|
-
<key>RunAtLoad</key>
|
45
|
-
<true/>
|
46
|
-
<key>KeepAlive</key>
|
47
|
-
<false/>
|
48
|
-
</dict>
|
49
|
-
</plist>
|
50
|
-
"""
|
51
|
-
try:
|
52
|
-
if enable:
|
53
|
-
os.makedirs(os.path.dirname(plist_path), exist_ok=True)
|
54
|
-
with open(plist_path, "w") as f:
|
55
|
-
f.write(plist_content)
|
56
|
-
os.chmod(plist_path, 0o644)
|
57
|
-
else:
|
58
|
-
if os.path.exists(plist_path):
|
59
|
-
os.remove(plist_path)
|
60
|
-
return True
|
61
|
-
except (IOError, OSError) as e:
|
62
|
-
print(f"Error setting auto start on macOS: {e}")
|
63
|
-
return False
|
64
|
-
|
65
|
-
def _set_auto_start_linux(self, enable: bool):
|
66
|
-
autostart_dir = os.path.expanduser("~/.config/autostart")
|
67
|
-
desktop_file_path = os.path.join(autostart_dir, f"{self.app_name}.desktop")
|
68
|
-
desktop_content = f"""[Desktop Entry]
|
69
|
-
Type=Application
|
70
|
-
Exec={self.app_path}
|
71
|
-
Hidden=false
|
72
|
-
NoDisplay=false
|
73
|
-
X-GNOME-Autostart-enabled=true
|
74
|
-
Name={self.app_name}
|
75
|
-
Comment=Pylon Application
|
76
|
-
"""
|
77
|
-
if enable:
|
78
|
-
os.makedirs(autostart_dir, exist_ok=True)
|
79
|
-
with open(desktop_file_path, "w") as f:
|
80
|
-
f.write(desktop_content)
|
81
|
-
else:
|
82
|
-
if os.path.exists(desktop_file_path):
|
83
|
-
os.remove(desktop_file_path)
|
84
|
-
|
85
|
-
def is_auto_start(self):
|
86
|
-
if sys.platform == "win32":
|
87
|
-
key_path = r"Software\Microsoft\Windows\CurrentVersion\Run"
|
88
|
-
try:
|
89
|
-
key = reg.OpenKey(reg.HKEY_CURRENT_USER, key_path, 0, reg.KEY_READ)
|
90
|
-
reg.QueryValueEx(key, self.app_name)
|
91
|
-
reg.CloseKey(key)
|
92
|
-
return True
|
93
|
-
except WindowsError:
|
94
|
-
return False
|
95
|
-
elif sys.platform == "darwin":
|
96
|
-
plist_path = os.path.expanduser(f"~/Library/LaunchAgents/com.{self.app_name}.plist")
|
97
|
-
return os.path.exists(plist_path)
|
98
|
-
elif sys.platform.startswith("linux"):
|
99
|
-
desktop_file_path = os.path.expanduser(f"~/.config/autostart/{self.app_name}.desktop")
|
100
|
-
return os.path.exists(desktop_file_path)
|
101
|
-
return False
|
1
|
+
import sys
|
2
|
+
import os
|
3
|
+
if sys.platform == "win32":
|
4
|
+
import winreg as reg
|
5
|
+
|
6
|
+
class AutoStart:
|
7
|
+
def __init__(self, app_name, app_path):
|
8
|
+
self.app_name = app_name
|
9
|
+
self.app_path = app_path
|
10
|
+
|
11
|
+
def set_auto_start(self, enable: bool):
|
12
|
+
if sys.platform == "win32":
|
13
|
+
self._set_auto_start_windows(enable)
|
14
|
+
elif sys.platform == "darwin":
|
15
|
+
self._set_auto_start_macos(enable)
|
16
|
+
elif sys.platform.startswith("linux"):
|
17
|
+
self._set_auto_start_linux(enable)
|
18
|
+
|
19
|
+
def _set_auto_start_windows(self, enable: bool):
|
20
|
+
key_path = r"Software\Microsoft\Windows\CurrentVersion\Run"
|
21
|
+
try:
|
22
|
+
key = reg.OpenKey(reg.HKEY_CURRENT_USER, key_path, 0, reg.KEY_ALL_ACCESS)
|
23
|
+
if enable:
|
24
|
+
reg.SetValueEx(key, self.app_name, 0, reg.REG_SZ, self.app_path)
|
25
|
+
else:
|
26
|
+
reg.DeleteValue(key, self.app_name)
|
27
|
+
reg.CloseKey(key)
|
28
|
+
return True
|
29
|
+
except WindowsError:
|
30
|
+
return False
|
31
|
+
|
32
|
+
def _set_auto_start_macos(self, enable: bool):
|
33
|
+
plist_path = os.path.expanduser(f"~/Library/LaunchAgents/com.{self.app_name}.plist")
|
34
|
+
plist_content = f"""<?xml version="1.0" encoding="UTF-8"?>
|
35
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
36
|
+
<plist version="1.0">
|
37
|
+
<dict>
|
38
|
+
<key>Label</key>
|
39
|
+
<string>com.{self.app_name}</string>
|
40
|
+
<key>ProgramArguments</key>
|
41
|
+
<array>
|
42
|
+
<string>{self.app_path}</string>
|
43
|
+
</array>
|
44
|
+
<key>RunAtLoad</key>
|
45
|
+
<true/>
|
46
|
+
<key>KeepAlive</key>
|
47
|
+
<false/>
|
48
|
+
</dict>
|
49
|
+
</plist>
|
50
|
+
"""
|
51
|
+
try:
|
52
|
+
if enable:
|
53
|
+
os.makedirs(os.path.dirname(plist_path), exist_ok=True)
|
54
|
+
with open(plist_path, "w") as f:
|
55
|
+
f.write(plist_content)
|
56
|
+
os.chmod(plist_path, 0o644)
|
57
|
+
else:
|
58
|
+
if os.path.exists(plist_path):
|
59
|
+
os.remove(plist_path)
|
60
|
+
return True
|
61
|
+
except (IOError, OSError) as e:
|
62
|
+
print(f"Error setting auto start on macOS: {e}")
|
63
|
+
return False
|
64
|
+
|
65
|
+
def _set_auto_start_linux(self, enable: bool):
|
66
|
+
autostart_dir = os.path.expanduser("~/.config/autostart")
|
67
|
+
desktop_file_path = os.path.join(autostart_dir, f"{self.app_name}.desktop")
|
68
|
+
desktop_content = f"""[Desktop Entry]
|
69
|
+
Type=Application
|
70
|
+
Exec={self.app_path}
|
71
|
+
Hidden=false
|
72
|
+
NoDisplay=false
|
73
|
+
X-GNOME-Autostart-enabled=true
|
74
|
+
Name={self.app_name}
|
75
|
+
Comment=Pylon Application
|
76
|
+
"""
|
77
|
+
if enable:
|
78
|
+
os.makedirs(autostart_dir, exist_ok=True)
|
79
|
+
with open(desktop_file_path, "w") as f:
|
80
|
+
f.write(desktop_content)
|
81
|
+
else:
|
82
|
+
if os.path.exists(desktop_file_path):
|
83
|
+
os.remove(desktop_file_path)
|
84
|
+
|
85
|
+
def is_auto_start(self):
|
86
|
+
if sys.platform == "win32":
|
87
|
+
key_path = r"Software\Microsoft\Windows\CurrentVersion\Run"
|
88
|
+
try:
|
89
|
+
key = reg.OpenKey(reg.HKEY_CURRENT_USER, key_path, 0, reg.KEY_READ)
|
90
|
+
reg.QueryValueEx(key, self.app_name)
|
91
|
+
reg.CloseKey(key)
|
92
|
+
return True
|
93
|
+
except WindowsError:
|
94
|
+
return False
|
95
|
+
elif sys.platform == "darwin":
|
96
|
+
plist_path = os.path.expanduser(f"~/Library/LaunchAgents/com.{self.app_name}.plist")
|
97
|
+
return os.path.exists(plist_path)
|
98
|
+
elif sys.platform.startswith("linux"):
|
99
|
+
desktop_file_path = os.path.expanduser(f"~/.config/autostart/{self.app_name}.desktop")
|
100
|
+
return os.path.exists(desktop_file_path)
|
101
|
+
return False
|