PyQt5 runJavaScript的使用

本文介绍了一个使用PyQt5实现的网页视图交互示例。通过创建一个包含表单的简单HTML页面,并利用PyQt5的QWebEngineView组件显示该页面。示例展示了如何通过按钮触发JavaScript函数,完成表单字段填充并获取返回值。

PyQt5 runJavaScript的使用

示例代码:

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton
from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineView

# Create an application
app = QApplication([])

# And a window
win = QWidget()
win.setWindowTitle('QWebView Interactive Demo')

# And give it a layout
layout = QVBoxLayout()
win.setLayout(layout)

# Create and fill a QWebView
view = QWebEngineView()
view.setHtml('''
  <html>
    <head>
      <title>A Demo Page</title>

      <script language="javascript">
        // Completes the full-name control and
        // shows the submit button
        function completeAndReturnName() {
          var fname = document.getElementById('fname').value;
          var lname = document.getElementById('lname').value;
          var full = fname + ' ' + lname;

          document.getElementById('fullname').value = full;
          document.getElementById('submit-btn').style.display = 'block';

          return full;
        }
      </script>
    </head>
    <body>
      <form>
        <label for="fname">First name:</label>
        <input type="text" name="fname" id="fname"></input>
        <br />
        <label for="lname">Last name:</label>
        <input type="text" name="lname" id="lname"></input>
        <br />
        <label for="fullname">Full name:</label>
        <input disabled type="text" name="fullname" id="fullname"></input>
        <br />
        <input style="display: none;" type="submit" id="submit-btn"></input>
      </form>
    </body>
  </html>
''')

# A button to call our JavaScript
button = QPushButton('Set Full Name')

# Interact with the HTML page by calling the completeAndReturnName
# function; print its return value to the console
# --------------------------------PyQt4语法----------------------------- #
# def complete_name():                                                  # 报错
#     frame = view.page().mainFrame()                                   # PyQt4中的mainFrame在PyQt5中已废弃
#     print(frame.evaluateJavaScript('completeAndReturnName();'))       #
# --------------------------------------------------------------------- #

# --------------------------------PyQt5语法-----------------------------
def js_callback(result):
    print(result)

def complete_name():
    view.page().runJavaScript('completeAndReturnName();', js_callback)  # PyQt5使用runJavaScript修正
# ---------------------------------------------------------------------

# Connect 'complete_name' to the button's 'clicked' signal
button.clicked.connect(complete_name)

# Add the QWebView and button to the layout
layout.addWidget(view)
layout.addWidget(button)

# Show the window and run the app
win.show()
app.exec_()

可参考:

### PYQT5 实战教程与示例代码 以下是关于 PyQt5 的实际应用案例和示例代码,涵盖了从基础到高级的功能实现。 #### 1. 基础窗口创建 以下是一个简单的 PyQt5 应用程序,展示了如何创建一个基本的窗口并显示消息: ```python from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout app = QApplication([]) # 创建应用程序对象 window = QWidget() # 创建窗口对象 layout = QVBoxLayout() # 创建布局对象(垂直布局管理器) label = QLabel('Hello, PyQt!') # 创建标签对象 layout.addWidget(label) # 将标签添加到布局中 window.setLayout(layout) # 将布局设置给窗口 window.show() # 显示窗口 app.exec_() # 运行应用程序 ``` 上述代码实现了最基础的 GUI 窗口功能[^4]。 --- #### 2. 用户登录界面 下面展示了一个带有用户名和密码输入框以及登录按钮的简单用户登录界面: ```python from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QVBoxLayout, QLabel class LoginWindow(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): layout = QVBoxLayout() self.username_label = QLabel("Username:") self.password_label = QLabel("Password:") self.username_input = QLineEdit() self.password_input = QLineEdit() self.login_button = QPushButton("Login") self.password_input.setEchoMode(QLineEdit.Password) self.login_button.clicked.connect(self.check_login) layout.addWidget(self.username_label) layout.addWidget(self.username_input) layout.addWidget(self.password_label) layout.addWidget(self.password_input) layout.addWidget(self.login_button) self.setLayout(layout) self.setWindowTitle("Login Form") def check_login(self): username = self.username_input.text() password = self.password_input.text() if username == "admin" and password == "password": print("Login Successful!") else: print("Invalid Credentials!") if __name__ == "__main__": app = QApplication([]) window = LoginWindow() window.show() app.exec_() ``` 此代码片段演示了如何通过 `QPushButton` 和 `QLineEdit` 构建一个完整的用户登录表单,并处理用户的点击事件。 --- #### 3. 关闭事件重写 (`closeEvent`) 当需要自定义窗口关闭行为时,可以通过重写 `closeEvent` 方法来实现。例如,在退出前提示用户确认操作: ```python import sys from PyQt5.QtCore import QCoreApplication from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication class Example(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): exit_action = QAction(QIcon('exit.png'), '&Exit', self) exit_action.setShortcut('Ctrl+Q') exit_action.setStatusTip('Exit application') exit_action.triggered.connect(qApp.quit) menubar = self.menuBar() file_menu = menubar.addMenu('&File') file_menu.addAction(exit_action) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Custom Close Event') def closeEvent(self, event): reply = QMessageBox.question( self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No ) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_()) ``` 这段代码展示了如何在关闭窗口之前弹出对话框询问用户是否真的要退出[^1]。 --- #### 4. PyQt5 与 JavaScript 交互 PyQt5 提供了一种机制,允许其嵌入的 Web 浏览器组件 (如 `QWebEngineView`) 与网页中的 JavaScript 脚本进行通信。这使得开发者可以在 Python 中调用 JavaScript 函数或将数据传递回前端页面。 ```python from PyQt5.QtCore import QUrl from PyQt5.QtWidgets import QApplication from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebChannel html_content = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>PyQt5 & JS Interaction</title> <script type="text/javascript"> function callFromPython(message){ alert(`Called from Python with message: ${message}`); } </script> </head> <body> <h1>Hello PyQt5!</h1> <button onclick="callToPython()">Call Python Function</button> <script type="text/javascript"> var bridge; function setBridge(obj){ bridge = obj; } function callToPython(){ bridge.callPythonFunction(); } </script> </body> </html> """ class Bridge(QObject): @pyqtSlot(str) def callPythonFunction(self): print("Called by JavaScript!") app = QApplication([]) view = QWebEngineView() channel = QWebChannel() bridge_instance = Bridge() channel.registerObject("bridge", bridge_instance) view.page().setWebChannel(channel) view.setHtml(html_content) view.resize(640, 480) view.show() # Call a function inside the HTML page using Qt's evaluateJavaScript method. def call_js_function(): view.page().runJavaScript(f'callFromPython("{str(datetime.now())}")') timer = QTimer(interval=5000, timeout=call_js_function) timer.start() sys.exit(app.exec_()) ``` 该部分说明了 PyQt5 如何利用内置模块完成跨语言编程任务[^2]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值