90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
|
|
from PySide6.QtCore import QObject, Slot, Signal, QTimer
|
|||
|
|
from PySide6.QtWebChannel import QWebChannel
|
|||
|
|
import time
|
|||
|
|
|
|||
|
|
class WebviewBridge(QObject):
|
|||
|
|
"""Webview桥接类,用于处理前端和Python后端之间的通信"""
|
|||
|
|
|
|||
|
|
# 定义信号
|
|||
|
|
time_updated = Signal(str)
|
|||
|
|
message_received = Signal(str)
|
|||
|
|
|
|||
|
|
def __init__(self, parent=None):
|
|||
|
|
super().__init__(parent)
|
|||
|
|
self.frontend_ready = False
|
|||
|
|
self.timer = QTimer()
|
|||
|
|
self.timer.timeout.connect(self.send_time)
|
|||
|
|
|
|||
|
|
@Slot()
|
|||
|
|
def on_frontend_ready(self):
|
|||
|
|
"""当前端准备就绪时调用"""
|
|||
|
|
print("Frontend is ready")
|
|||
|
|
self.frontend_ready = True
|
|||
|
|
# 启动定时器,每秒更新一次时间
|
|||
|
|
self.timer.start(1000)
|
|||
|
|
|
|||
|
|
@Slot(str, result=str)
|
|||
|
|
def hello(self, message):
|
|||
|
|
"""处理前端发送的消息"""
|
|||
|
|
print('Message received from frontend:', message)
|
|||
|
|
response = f'Hello from Python: {message}'
|
|||
|
|
self.message_received.emit(response)
|
|||
|
|
return response
|
|||
|
|
|
|||
|
|
def send_time(self):
|
|||
|
|
"""定期向前端发送时间更新"""
|
|||
|
|
if self.frontend_ready:
|
|||
|
|
current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
|
|||
|
|
self.time_updated.emit(current_time)
|
|||
|
|
return current_time
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
def set_frontend_ready(self, ready=True):
|
|||
|
|
"""设置前端准备状态"""
|
|||
|
|
self.frontend_ready = ready
|
|||
|
|
|
|||
|
|
class WebviewController(QObject):
|
|||
|
|
"""Webview控制器类,负责管理Webview的逻辑"""
|
|||
|
|
|
|||
|
|
def __init__(self, web_engine_page, parent=None):
|
|||
|
|
super().__init__(parent)
|
|||
|
|
self.page = web_engine_page
|
|||
|
|
self.bridge = WebviewBridge()
|
|||
|
|
self.channel = QWebChannel()
|
|||
|
|
self.channel.registerObject('py', self.bridge)
|
|||
|
|
self.page.setWebChannel(self.channel)
|
|||
|
|
|
|||
|
|
# 连接bridge的信号
|
|||
|
|
self.bridge.time_updated.connect(self.on_time_updated)
|
|||
|
|
self.bridge.message_received.connect(self.on_message_received)
|
|||
|
|
|
|||
|
|
def on_time_updated(self, time_str):
|
|||
|
|
"""当bridge发出time_updated信号时调用"""
|
|||
|
|
print(f"Time updated: {time_str}")
|
|||
|
|
# 调用前端的update_time函数
|
|||
|
|
js_code = f"""
|
|||
|
|
try {{
|
|||
|
|
if (typeof update_time !== 'undefined' && typeof update_time === 'function') {{
|
|||
|
|
update_time('{time_str}');
|
|||
|
|
}}
|
|||
|
|
}} catch (e) {{
|
|||
|
|
console.error('Error calling update_time:', e);
|
|||
|
|
}}
|
|||
|
|
"""
|
|||
|
|
self.page.runJavaScript(js_code)
|
|||
|
|
|
|||
|
|
def on_message_received(self, message):
|
|||
|
|
"""当bridge发出message_received信号时调用"""
|
|||
|
|
print(f"Message received: {message}")
|
|||
|
|
# 调用前端的消息处理函数
|
|||
|
|
js_code = f"""
|
|||
|
|
try {{
|
|||
|
|
if (typeof app_sendMessage !== 'undefined' && typeof app_sendMessage === 'function') {{
|
|||
|
|
app_sendMessage('{message}');
|
|||
|
|
}}
|
|||
|
|
}} catch (e) {{
|
|||
|
|
console.error('Error calling app_sendMessage:', e);
|
|||
|
|
}}
|
|||
|
|
"""
|
|||
|
|
self.page.runJavaScript(js_code)
|
|||
|
|
|