p y q t 5 开 发 浏 览 器 ( p y q t 5 Q W e b E n g i n e V i e w 开 发 浏 览 器 ) pyqt5 开发浏览器 (pyqt5 QWebEngineView开发浏览器)pyqt5开发浏览器(pyqt5QWebEngineView开发浏览器)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyQt5==5.10.1
pip install cefpython3==66.0
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl
app = QApplication([])
view = QWebEngineView()
view.load(QUrl("http://www.baidu.com"))
view.show()
app.exec_()
使用Google内核–cefpython3
参考文献看这篇文章就可以做出来,我就是照这个做的
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtWidgets import QMainWindow, QGridLayout, QFrame, QApplication, QPushButton, QWidget
from cefpython3 import cefpython as cef
import ctypes
import os
import platform
import sys
CefWidgetParent = QWidget
WindowUtils = cef.WindowUtils()
WINDOWS = (platform.system() == "Windows")
# Configuration
WIDTH = 1200
HEIGHT = 800
class MainWindow(QMainWindow):
def __init__(self):
# noinspection PyArgumentList
super(MainWindow, self).__init__(None)
# Avoids crash when shutting down CEF (issue #360)
self.cef_widget = None
self.navigation_bar = None
self.setFocusPolicy(Qt.StrongFocus)
self.setupLayout()
self.setWindowTitle('慧明大数据平台')
def setupLayout(self):
self.resize(WIDTH, HEIGHT)
self.cef_widget = CefWidget(self)
self.navigation_bar = NavigationBar(self.cef_widget)
layout = QGridLayout()
# noinspection PyArgumentList
layout.addWidget(self.navigation_bar, 0, 0)
# noinspection PyArgumentList
layout.addWidget(self.cef_widget, 1, 0)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
layout.setRowStretch(0, 0)
layout.setRowStretch(1, 1)
# noinspection PyArgumentList
frame = QFrame()
frame.setLayout(layout)
self.setCentralWidget(frame)
self.show()
# Browser can be embedded only after layout was set up
self.cef_widget.embedBrowser()
def closeEvent(self, event):
# Close browser (force=True) and free CEF reference
if self.cef_widget.browser:
self.cef_widget.browser.CloseBrowser(True)
self.clear_browser_references()
def clear_browser_references(self):
# Clear browser references that you keep anywhere in your
# code. All references must be cleared for CEF to shutdown cleanly.
self.cef_widget.browser = None
class CefWidget(CefWidgetParent):
def __init__(self, parent=None):
# noinspection PyArgumentList
super(CefWidget, self).__init__(parent)
self.parent = parent
self.browser = None
self.hidden_window = None # Required for PyQt5 on Linux
self.show()
def focusInEvent(self, event):
# This event seems to never get called on Linux, as CEF is
# stealing all focus due to Issue #284.
if cef.GetAppSetting("debug"):
print("[qt.py] CefWidget.focusInEvent")
if self.browser:
WindowUtils.OnSetFocus(self.getHandle(), 0, 0, 0)
self.browser.SetFocus(True)
def focusOutEvent(self, event):
# This event seems to never get called on Linux, as CEF is
# stealing all focus due to Issue #284.
if cef.GetAppSetting("debug"):
print("[qt.py] CefWidget.focusOutEvent")
if self.browser:
self.browser.SetFocus(False)
def embedBrowser(self):
window_info = cef.WindowInfo()
rect = [0, 0, self.width(), self.height()]
window_info.SetAsChild(self.getHandle(), rect)
self.browser = cef.CreateBrowserSync(window_info,
url="http://58.217.124.122:8082/")
self.browser.SetClientHandler(LoadHandler(self.parent.navigation_bar))
self.browser.SetClientHandler(FocusHandler(self))
def getHandle(self):
if self.hidden_window:
# PyQt5 on Linux
return int(self.hidden_window.winId())
try:
# PyQt4 and PyQt5
return int(self.winId())
except:
# PySide:
# | QWidget.winId() returns <PyCObject object at 0x02FD8788>
# | Converting it to int usiteng ctypes.
if sys.version_info[0] == 2:
# Python 2
ctypes.pythonapi.PyCObject_AsVoidPtr.restype = (
ctypes.c_void_p)
ctypes.pythonapi.PyCObject_AsVoidPtr.argtypes = (
[ctypes.py_object])
return ctypes.pythonapi.PyCObject_AsVoidPtr(self.winId())
else:
# Python 3
ctypes.pythonapi.PyCapsule_GetPointer.restype = (
ctypes.c_void_p)
ctypes.pythonapi.PyCapsule_GetPointer.argtypes = (
[ctypes.py_object])
return ctypes.pythonapi.PyCapsule_GetPointer(
self.winId(), None)
def moveEvent(self, _):
self.x = 0
self.y = 0
if self.browser:
WindowUtils.OnSize(self.getHandle(), 0, 0, 0)
self.browser.NotifyMoveOrResizeStarted()
def resizeEvent(self, event):
size = event.size()
if self.browser:
WindowUtils.OnSize(self.getHandle(), 0, 0, 0)
self.browser.NotifyMoveOrResizeStarted()
class CefApplication(QApplication):
def __init__(self, args):
super(CefApplication, self).__init__(args)
if not cef.GetAppSetting("external_message_pump"):
self.timer = self.createTimer()
self.setupIcon()
def createTimer(self):
timer = QTimer()
# noinspection PyUnresolvedReferences
timer.timeout.connect(self.onTimer)
timer.start(10)
return timer
def onTimer(self):
cef.MessageLoopWork()
def stopTimer(self):
# Stop the timer after Qt's message loop has ended
self.timer.stop()
def setupIcon(self):
icon_file = os.path.join(os.path.abspath(os.path.dirname(__file__)),
"resources", "hm.png")
if os.path.exists(icon_file):
self.setWindowIcon(QIcon(icon_file))
class LoadHandler(object):
def __init__(self, navigation_bar):
self.initial_app_loading = True
self.navigation_bar = navigation_bar
# def OnLoadingStateChange(self, **_):
# self.navigation_bar.updateState()
def OnLoadStart(self, browser, **_):
# self.navigation_bar.url.setText(browser.GetUrl())
if self.initial_app_loading:
self.navigation_bar.cef_widget.setFocus()
# Temporary fix no. 2 for focus issue on Linux (Issue #284)
class FocusHandler(object):
def __init__(self, cef_widget):
self.cef_widget = cef_widget
def OnTakeFocus(self, **_):
if cef.GetAppSetting("debug"):
print("[qt.py] FocusHandler.OnTakeFocus")
def OnSetFocus(self, **_):
if cef.GetAppSetting("debug"):
print("[qt.py] FocusHandler.OnSetFocus")
def OnGotFocus(self, browser, **_):
if cef.GetAppSetting("debug"):
print("[qt.py] FocusHandler.OnGotFocus")
self.cef_widget.setFocus()
# Temporary fix no. 1 for focus issues on Linux (Issue #284)
class NavigationBar(QFrame):
def __init__(self, cef_widget):
# noinspection PyArgumentList
super(NavigationBar, self).__init__()
self.cef_widget = cef_widget
# Init layout
layout = QGridLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
# Back button
self.back = self.createButton("back")
# noinspection PyUnresolvedReferences
self.back.clicked.connect(self.onBack)
# noinspection PyArgumentList
layout.addWidget(self.back, 0, 0)
# Forward button
self.forward = self.createButton("forward")
# noinspection PyUnresolvedReferences
self.forward.clicked.connect(self.onForward)
# noinspection PyArgumentList
layout.addWidget(self.forward, 0, 1)
# Reload button
self.reload = self.createButton("reload")
# noinspection PyUnresolvedReferences
self.reload.clicked.connect(self.onReload)
# noinspection PyArgumentList
layout.addWidget(self.reload, 0, 2)
# Url input
# self.url = QLineEdit("")
# # noinspection PyUnresolvedReferences
# self.url.returnPressed.connect(self.onGoUrl)
# # noinspection PyArgumentList
# layout.addWidget(self.url, 0, 3)
# Layout
self.setLayout(layout)
# self.updateState()
def onBack(self):
if self.cef_widget.browser:
self.cef_widget.browser.GoBack()
def onForward(self):
if self.cef_widget.browser:
self.cef_widget.browser.GoForward()
def onReload(self):
if self.cef_widget.browser:
self.cef_widget.browser.Reload()
def onGoUrl(self):
if self.cef_widget.browser:
self.cef_widget.browser.LoadUrl(self.url.text())
def updateState(self):
browser = self.cef_widget.browser
if not browser:
self.back.setEnabled(False)
self.forward.setEnabled(False)
self.reload.setEnabled(False)
# self.url.setEnabled(False)
return
self.back.setEnabled(browser.CanGoBack())
self.forward.setEnabled(browser.CanGoForward())
self.reload.setEnabled(True)
self.url.setEnabled(True)
self.url.setText(browser.GetUrl())
def createButton(self, name):
resources = os.path.join(os.path.abspath(os.path.dirname(__file__)),
"resources")
pixmap = QPixmap(os.path.join(resources, "{0}.png".format(name)))
icon = QIcon(pixmap)
button = QPushButton()
button.setIcon(icon)
button.setIconSize(pixmap.rect().size())
return button
sys.excepthook = cef.ExceptHook # To shutdown all CEF processes on error
settings = {}
cef.Initialize(settings)
app = CefApplication(sys.argv)
main_window = MainWindow()
main_window.show()
main_window.activateWindow()
main_window.raise_()
app.exec_()
if not cef.GetAppSetting("external_message_pump"):
app.stopTimer()
del main_window # Just to be safe, similarly to "del app"
del app # Must destroy app object before calling Shutdown
cef.Shutdown()
"""
This is an example of using PyInstaller packager to build
executable from one of CEF Python's examples (wxpython.py).
See README-pyinstaller.md for installing required packages.
To package example type: `python pyinstaller.py`.
"""
import os
import platform
import shutil
import sys
from subprocess import Popen
try:
import PyInstaller
except ImportError:
PyInstaller = None
raise SystemExit("Error: PyInstaller package missing. "
"To install type: pip install --upgrade pyinstaller")
EXE_EXT = ""
if platform.system() == "Windows":
EXE_EXT = ".exe"
elif platform.system() == "Darwin":
EXE_EXT = ".app"
elif platform.system() == "Linux":
EXE_EXT = ""
def main():
# Platforms supported
if platform.system() not in ["Windows", "Darwin", "Linux"]:
raise SystemExit("Error: Only Windows, Linux and Darwin platforms are "
"currently supported. See Issue #135 for details.")
# Make sure nothing is cached from previous build.
# Delete the build/ and dist/ directories.
if os.path.exists("build/"):
shutil.rmtree("build/")
if os.path.exists("dist/"):
shutil.rmtree("dist/")
# Execute pyinstaller.
# Note: the "--clean" flag passed to PyInstaller will delete
# global global cache and temporary files from previous
# runs. For example on Windows this will delete the
# "%appdata%/roaming/pyinstaller/bincache00_py27_32bit"
# directory.
env = os.environ
if "--debug" in sys.argv:
env["CEFPYTHON_PYINSTALLER_DEBUG"] = "1"
sub = Popen(["pyinstaller", "--clean", "pyinstaller.spec"], env=env)
sub.communicate()
rcode = sub.returncode
if rcode != 0:
print("Error: PyInstaller failed, code=%s" % rcode)
# Delete distribution directory if created
if os.path.exists("dist/"):
shutil.rmtree("dist/")
sys.exit(1)
# Make sure everything went fine
curdir = os.path.dirname(os.path.abspath(__file__))
cefapp_dir = os.path.join(curdir, "dist", "cefapp")
executable = os.path.join(cefapp_dir, "慧明大数据管理平台"+EXE_EXT)
if not os.path.exists(executable):
print("Error: PyInstaller failed, main executable is missing: %s"
% executable)
#sys.exit(1)
# Done
print("OK. Created dist/ directory.")
# On Windows open folder in explorer or when --debug is passed
# run the result binary using "cmd.exe /k cefapp.exe", so that
# console window doesn't close.
if platform.system() == "Windows":
if "--debug" in sys.argv:
os.system("start cmd /k \"%s\"" % executable)
else:
# SYSTEMROOT = C:/Windows
os.system("%s/explorer.exe /n,/e,%s" % (
os.environ["SYSTEMROOT"], cefapp_dir))
if __name__ == "__main__":
main()
# -*- mode: python -*-
# -*- coding: utf-8 -*-
"""
This is a PyInstaller spec file.
"""
import os
from PyInstaller.building.api import PYZ, EXE, COLLECT
from PyInstaller.building.build_main import Analysis
from PyInstaller.utils.hooks import is_module_satisfies
from PyInstaller.archive.pyz_crypto import PyiBlockCipher
# Constants
DEBUG = os.environ.get("CEFPYTHON_PYINSTALLER_DEBUG", False)
PYCRYPTO_MIN_VERSION = "2.6.1"
# Set this secret cipher to some secret value. It will be used
# to encrypt archive package containing your app's bytecode
# compiled Python modules, to make it harder to extract these
# files and decompile them. If using secret cipher then you
# must install pycrypto package by typing: "pip install pycrypto".
# Note that this will only encrypt archive package containing
# imported modules, it won't encrypt the main script file
# (wxpython.py). The names of all imported Python modules can be
# still accessed, only their contents are encrypted.
SECRET_CIPHER = "This-is-a-secret-phrase" # Only first 16 chars are used
# ----------------------------------------------------------------------------
# Main
# ----------------------------------------------------------------------------
if SECRET_CIPHER:
# If using secret cipher then pycrypto package must be installed
if not is_module_satisfies("pycrypto >= %s" % PYCRYPTO_MIN_VERSION):
raise SystemExit("Error: pycrypto %s or higher is required. "
"To install type: pip install --upgrade pycrypto"
% PYCRYPTO_MIN_VERSION)
cipher_obj = PyiBlockCipher(key=SECRET_CIPHER)
else:
cipher_obj = None
a = Analysis(
["tkinter_.py"],
hookspath=["."], # To find "hook-cefpython3.py"
cipher=cipher_obj,
win_private_assemblies=True,
win_no_prefer_redirects=True,
)
if not os.environ.get("PYINSTALLER_CEFPYTHON3_HOOK_SUCCEEDED", None):
raise SystemExit("Error: Pyinstaller hook-cefpython3.py script was "
"not executed or it failed")
pyz = PYZ(a.pure,
a.zipped_data,
cipher=cipher_obj)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name="慧明大数据管理平台",
debug=DEBUG,
strip=False,
upx=False,
console=DEBUG,
icon="favicon.ico")
COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=False,
name="cefapp")
版权声明:本文为qq_41375318原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。