This commit is contained in:
恍兮惚兮 2024-04-28 18:16:51 +08:00
parent c29c6f5927
commit 7f3408147e
3 changed files with 21 additions and 215 deletions

View File

@ -1,4 +1,4 @@
import functools, time, qtawesome
import functools, time, qtawesome, platform
from datetime import datetime, timedelta
from gui.specialwidget import ScrollFlow, chartwidget, lazyscrollflow
from PyQt5.QtWidgets import (
@ -269,7 +269,13 @@ class browserdialog(QDialog):
if self.webviewv == 0:
self.browser.resize(*rect)
elif self.webviewv == 1:
self.browser.set_geo(*rect)
# self.browser.set_geo(*rect)
from webviewpy import webview_native_handle_kind_t
hwnd = self.browser.get_native_handle(
webview_native_handle_kind_t.WEBVIEW_NATIVE_HANDLE_KIND_UI_WIDGET
)
windows.MoveWindow(hwnd, rect[0], rect[1], rect[2], rect[3], True)
def __init__(self, parent, textsource_or_exepath) -> None:
super().__init__(parent, Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint)
@ -281,15 +287,24 @@ class browserdialog(QDialog):
except:
self.exepath = "0"
self._resizable = False
self.resize(1300, 801)
self.webviewv = globalconfig["usewebview"]
if self.webviewv == 0:
self.browser = winsharedutils.HTMLBrowser(int(self.winId()))
elif self.webviewv == 1:
from webview import Webview
from webviewpy import Webview, declare_library_path
declare_library_path(
os.path.abspath(
os.path.join(
"files/plugins/",
("DLL32", "DLL64")[platform.architecture()[0] == "64bit"],
"webview",
)
)
)
self.browser = Webview(
0, int(self.winId())
False, int(self.winId())
) # 构造函数里会触发ResizeEvent。虽然确实有问题但很奇怪前一天晚上正常第二天起来就崩溃了。
self.setWindowTitle(savehook_new_data[self.exepath]["title"])
self.nettab = QTabWidget(self)

View File

@ -1,209 +0,0 @@
import platform, os
from ctypes import (
CDLL,
c_int,
c_void_p,
c_char_p,
Structure,
c_uint,
c_char,
POINTER,
CFUNCTYPE,
cast,
pointer,
)
from typing import Callable, Union, Tuple
HWND = c_void_p
webview_t = c_void_p
isbit64 = platform.architecture()[0] == "64bit"
DLL3264path = os.path.abspath(
os.path.join("files/plugins/", ("DLL32", "DLL64")[isbit64])
)
try:
_webview = CDLL(os.path.join(DLL3264path, "webview"))
except:
raise Exception(
'load module "{}" failed'.format(os.path.join(DLL3264path, "webview"))
)
class webview_version_t(Structure):
_fields_ = [("major", c_uint), ("minor", c_uint), ("patch", c_uint)]
class webview_version_info_t(Structure):
_fields_ = [
("version", webview_version_t),
("version_number", c_char * 32),
("pre_release", c_char * 48),
("build_metadata", c_char * 48),
]
class SizeHints(c_int):
WEBVIEW_HINT_NONE = 0
WEBVIEW_HINT_MIN = 1
WEBVIEW_HINT_MAX = 2
WEBVIEW_HINT_FIXED = 3
_webview_create = _webview.webview_create
_webview_create.argtypes = c_int, c_void_p
_webview_create.restype = webview_t
_webview_destroy = _webview.webview_destroy
_webview_destroy.argtypes = (webview_t,)
_webview_set_title = _webview.webview_set_title
_webview_set_title.argtypes = webview_t, c_char_p
_webview_set_size = _webview.webview_set_size
_webview_set_geo = _webview.webview_set_geo
_webview_set_size.argtypes = webview_t, c_int, c_int, c_int
_webview_set_geo.argtypes = webview_t, c_int, c_int, c_int, c_int
_webview_set_html = _webview.webview_set_html
_webview_set_html.argtypes = webview_t, c_char_p
_webview_run = _webview.webview_run
_webview_run.argtypes = (webview_t,)
_webview_destroy = _webview.webview_destroy
_webview_destroy.argtypes = (webview_t,)
_webview_navigate = _webview.webview_navigate
_webview_navigate.argtypes = webview_t, c_char_p
_webview_eval = _webview.webview_eval
_webview_eval.argtypes = webview_t, c_char_p
_webview_get_window = _webview.webview_get_window
_webview_get_window.argtypes = (webview_t,)
_webview_get_window.restype = HWND
_webview_init = _webview.webview_init
_webview_init.argtypes = webview_t, c_char_p
_webview_version = _webview.webview_version
_webview_version.restype = POINTER(webview_version_info_t)
_webview_terminate = _webview.webview_terminate
_webview_terminate.argtypes = (webview_t,)
_webview_unbind = _webview.webview_unbind
_webview_unbind.argtypes = webview_t, c_char_p
_webview_return = _webview.webview_return
_webview_return.argtypes = webview_t, c_char_p, c_uint, c_char_p
_webview_dispatch = _webview.webview_dispatch
_webview_dispatch.argtypes = webview_t, c_void_p, c_void_p
_webview_bind = _webview.webview_bind
_webview_bind.argtypes = webview_t, c_char_p, c_void_p, c_void_p
class _Webview_Version:
def __init__(self, v: webview_version_t) -> None:
self.major = v.major
self.minor = v.minor
self.patch = v.patch
def __repr__(self) -> str:
return "{}.{}.{}".format(self.major, self.minor, self.patch)
class Webview_Version:
def __repr__(self) -> str:
return self.version_number
def __init__(self, lpwv: POINTER(webview_version_info_t)) -> None:
self.version = _Webview_Version(lpwv.contents.version)
self.version_number = lpwv.contents.version_number.decode("utf8")
self.pre_release = lpwv.contents.pre_release.decode("utf8")
self.build_metadata = lpwv.contents.build_metadata.decode("utf8")
class Webview:
def __init__(
self, debug: bool = False, wnd: HWND = None, init_js: str = None
) -> None:
self.pwebview = 0
if wnd: # 很坑这个wnd并不是HWND而是指向HWND的一个指针
_HWND = HWND(wnd)
wnd = pointer(_HWND)
_w = _webview_create(debug, wnd)
if _w == 0:
raise Exception()
self.pwebview = _w
if init_js:
self.init(init_js)
def resolve(self, seq: str, status: int, result: str):
_webview_return(
self.pwebview, seq.encode("utf8"), status, result.encode("utf8")
)
def bind(
self, name: str, fn: Callable[[str, str], Union[None, str, Tuple[str, int]]]
) -> None:
def wrapped_fn(seq: c_char_p, req: c_char_p, args: c_void_p):
_result = fn(seq.decode("utf8"), req.decode("utf8"))
if _result is None:
return
if isinstance(_result, str):
result, status = _result, 0
elif isinstance(_result, Tuple[str, int]):
result, status = _result
_webview_return(self.pwebview, seq, status, result.encode("utf8"))
webview_bind_fn_t = CFUNCTYPE(None, c_char_p, c_char_p, c_void_p)
_webview_bind(
self.pwebview,
name.encode("utf8"),
cast(webview_bind_fn_t(wrapped_fn), c_void_p).value,
None,
)
def dispatch(self, fn: Callable[[], None]) -> None:
def wrapped_fn(_w: webview_t, _arg: c_void_p):
fn()
webview_dispatch_fn_t = CFUNCTYPE(None, webview_t, c_void_p)
_webview_dispatch(
self.pwebview, cast(webview_dispatch_fn_t(wrapped_fn), c_void_p).value, None
)
def unbind(self, name: str) -> None:
_webview_unbind(self.pwebview, name.encode("utf8"))
def get_window(self) -> HWND:
return _webview_get_window(self.pwebview)
def eval(self, js: str) -> None:
_webview_eval(self.pwebview, js.encode("utf8"))
def navigate(self, url: str) -> None:
_webview_navigate(self.pwebview, url.encode("utf8"))
def init(self, js: str):
_webview_init(self.pwebview, js.encode("utf8"))
def __del__(self) -> None:
if self.pwebview:
_webview_destroy(self.pwebview)
def run(self) -> None:
_webview_run(self.pwebview)
def set_html(self, html: str) -> None:
_webview_set_html(self.pwebview, html.encode("utf8"))
def set_size(
self, width: int, height: int, hints: SizeHints = SizeHints.WEBVIEW_HINT_NONE
) -> None:
_webview_set_size(self.pwebview, width, height, hints)
def set_geo(self, X: int, Y: int, width: int, height: int) -> None:
_webview_set_geo(self.pwebview, X, Y, width, height)
def set_title(self, title: str) -> None:
_webview_set_title(self.pwebview, title.encode("utf8"))
def terminate(self):
_webview_terminate(self.pwebview)
@staticmethod
def version() -> Webview_Version:
return Webview_Version(_webview_version())

View File

@ -1,6 +1,6 @@
PyQt5==5.15.10
PyQt5-Qt5==5.15.2
webviewpy==0.0.3
nuitka==2.0.5
imageio
pefile