53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
# bridge.py
|
|
import json
|
|
import time
|
|
from PyQt6.QtCore import QObject, QVariant, pyqtSlot, pyqtSignal, QTimer
|
|
from PyQt6.QtWebChannel import QWebChannel
|
|
from PyQt6.QtWebEngineWidgets import QWebEngineView
|
|
|
|
|
|
class PythonEventEmitter(QObject):
|
|
onEvent = pyqtSignal(str, "QVariantMap") # событие: тип + данные
|
|
|
|
|
|
class PythonJSBridge(QObject):
|
|
def __init__(self, browser: QWebEngineView):
|
|
super().__init__()
|
|
self.browser = browser
|
|
|
|
self.channel = QWebChannel()
|
|
self.browser.page().setWebChannel(self.channel)
|
|
|
|
self.emitter = PythonEventEmitter()
|
|
|
|
self.channel.registerObject("pyjs", self)
|
|
self.channel.registerObject("pyjs_events", self.emitter)
|
|
|
|
# Запуск таймера для отправки событий
|
|
self.timer = QTimer()
|
|
self.timer.timeout.connect(self.send_timer_event)
|
|
self.timer.start(1000) # раз в секунду
|
|
|
|
@pyqtSlot(str, str, result=str)
|
|
def callFromJS(self, command: str, data_json: str):
|
|
print(f"[Python] Получена команда: {command}")
|
|
|
|
if command == "init":
|
|
return json.dumps({"status": "ok", "message": "Инициализация завершена"})
|
|
|
|
elif command == "get_data":
|
|
return json.dumps([["A1", "B1"], ["A2", "B2"]])
|
|
|
|
elif command == "get_sheets":
|
|
return json.dumps(["Sheet1", "Sheet2"])
|
|
|
|
return json.dumps(None)
|
|
|
|
def send_event_to_js(self, event_type: str, data: dict):
|
|
self.emitter.onEvent.emit(event_type, data)
|
|
|
|
def send_timer_event(self):
|
|
current_time = time.strftime("%H:%M:%S")
|
|
print(f"[Python] Отправка события: {current_time}")
|
|
self.emitter.onEvent.emit("timer", {"time": current_time})
|