大佬教程收集整理的这篇文章主要介绍了是否可以在 kivy webiew 中与 javascript 和 python 交互?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要创建一个单独的java文件并添加它然后用jnius调用它吗?我不太了解androID java有没有其他人这样做过?
这是我尝试过的
from kivy.uix.screenmanager import Screen
from kivy.clock import Clock
from androID.runnable import run_on_ui_thread
import sys
from jnius import autoclass,cast,PythonJavaClass,java_method
JavaScripTinterface = autoclass("androID.webkit.JavaScripTinterface")
WebVIEwA = autoclass('androID.webkit.WebVIEw')
WebVIEwClIEnt = autoclass('androID.webkit.WebVIEwClIEnt')
LayoutParams = autoclass('androID.vIEw.VIEwGroup$LayoutParams')
linearLayout = autoclass('androID.Widget.linearLayout')
KeyEvent = autoclass('androID.vIEw.KeyEvent')
VIEwGroup = autoclass('androID.vIEw.VIEwGroup')
DownloadManager = autoclass('androID.app.DownloadManager')
DownloadManagerrequest = autoclass('androID.app.DownloadManager$request')
Uri = autoclass('androID.net.Uri')
Environment = autoclass('androID.os.Environment')
Context = autoclass('androID.content.Context')
PythonActivity = autoclass('org.kivy.androID.PythonActivity')
class DownloadListener(PythonJavaClass):
#https://stackoverflow.com/questions/10069050/download-file-insIDe-webvIEw
__javacontext__ = 'app'
__javainterfaces__ = ['androID/webkit/DownloadListener']
@java_method('(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V')
def onDownloadStart(self,url,userAgent,contentdis@R_404_4612@,mimetype,contentLength):
mActivity = PythonActivity.mActivity
context = mActivity.getApplicationContext()
visibility = DownloadManagerrequest.VISIBIliTY_VISIBLE_NOTIFY_COMPLETED
dir_type = Environment.DIRECTORY_DOWNLOADS
uri = Uri.parse(url)
filepath = uri.getLastPathSegment()
request = DownloadManagerrequest(uri)
request.setNotificationVisibility(visibility)
request.setDesTinationInExternalfilesDir(context,dir_type,filepath)
dm = cast(DownloadManager,mActivity.getSystemservice(Context.DOWNLOAD_serviCE))
dm.enqueue(request)
class KeyListener(PythonJavaClass):
__javacontext__ = 'app'
__javainterfaces__ = ['androID/vIEw/VIEw$OnKeyListener']
def __init__(self,Listener):
super().__init__()
self.Listener = Listener
@java_method('(LandroID/vIEw/VIEw;ILandroID/vIEw/KeyEvent;)Z')
def onKey(self,v,key_code,event):
if event.getAction() == KeyEvent.ACTION_DOWN and\
key_code == KeyEvent.KEYCODE_BACK:
return self.Listener()
class WebVIEw(Screen):
# https://developer.androID.com/reference/androID/webkit/WebVIEw
def __init__(self,enable_JavaScript = false,enable_downloads = false,enable_zoom = false,wIDth=None,height=None,height_offset=0,wIDth_offset=0,**kwargs):
super().__init__(**kwargs)
self.url = url
self.enable_JavaScript = enable_JavaScript
self.enable_downloads = enable_downloads
self.enable_zoom = enable_zoom
self.webvIEw = None
self.name = "webvIEw"
self.enable_dismiss = True
self.height_offset = height_offset
self.wIDth_offset = wIDth_offset
if wIDth:
self.wIDth = wIDth
if height:
self.height = height
#self.open()
@run_on_ui_thread
def on_enter(self):
mActivity = PythonActivity.mActivity
webvIEw = WebVIEwA(mActivity)
webvIEw.setWebVIEwClIEnt(WebVIEwClIEnt())
webvIEw.getSetTings().setJavaScriptEnabled(self.enable_JavaScript)
webvIEw.getSetTings().setBuilTinZoomControls(self.enable_zoom)
webvIEw.getSetTings().setdisplayZoomControls(false)
webvIEw.getSetTings().setAllowfileAccess(true) #default false API>29
layout = linearLayout(mActivity)
layout.setorIEntation(linearLayout.VERTICAL)
layout.addVIEw(webvIEw,self.wIDth,self.height)
mActivity.addContentVIEw(layout,LayoutParams(-1,-1))
webvIEw.setonKeyListener(KeyListener(self._BACk_pressed))
if self.enable_downloads:
webvIEw.setDownloadListener(DownloadListener())
self.webvIEw = webvIEw
self.layout = layout
self.webvIEw.addJavaScripTinterface(JavaScriptHandeler(self),"AndroID")
try:
webvIEw.loadUrl(self.url)
except Exception as e:
print('WebvIEw.create(): ' + str(E))
self.dismiss()
@run_on_ui_thread
def on_leave(self):
if self.enable_dismiss:
self.enable_dismiss = false
parent = cast(VIEwGroup,self.layout.getParent())
if parent is not None: parent.removeVIEw(self.layout)
self.webvIEw.clearHistory()
self.webvIEw.clearCache(true)
self.webvIEw.clearFormData()
self.webvIEw.destroy()
self.layout = None
self.webvIEw = None
@run_on_ui_thread
def on_size(self,instance,sizE):
if self.webvIEw:
params = self.webvIEw.getLayoutParams()
params.wIDth = (self.wIDth - self.wIDth_offset)
params.height = (self.height - self.height_offset)
self.webvIEw.setLayoutParams(params)
def pause(self):
if self.webvIEw:
self.webvIEw.pauseTimers()
self.webvIEw.onPause()
def resume(self):
if self.webvIEw:
self.webvIEw.onResume()
self.webvIEw.resumeTimers()
def downloads_directory(self):
# e.g. AndroID/data/org.test.myapp/files/Download
dir_type = Environment.DIRECTORY_DOWNLOADS
context = PythonActivity.mActivity.getApplicationContext()
directory = context.getExternalfilesDir(dir_typE)
return str(directory.getPath())
def _BACk_pressed(self):
if self.webvIEw.canGoBACk():
self.webvIEw.goBACk()
else:
self.dismiss()
return True
def dismiss(self):
parent = cast(VIEwGroup,self.layout.getParent())
if parent is not None: parent.removeVIEw(self.layout)
self.webvIEw.clearHistory()
self.webvIEw.clearCache(true)
self.webvIEw.clearFormData()
self.webvIEw.destroy()
self.layout = None
self.webvIEw = None
self.parent.remove_Widget(self)
sys.exit("CallBACk worked!")
class JavaScriptHandeler():
def __init__(self,mgr,*args,**kwargs):
super().__init__(mgr,**kwargs)
self.mgr = mgr
def JsCallBACk(self):
self.mgr.webkit.loadUrl("https://Google.com/")
它加载的 HTML 文件
<!DOCTYPE HTML>
<HTML charset="UTF-8" lang="en">
<head>
<script src="https://code.jquery.com/jquery-3.6.0.min.Js"></script>
<link rel="stylesheet" href="https://unpkg.com/tailwindCSS@^2.1.2/dist/tailwind.min.CSS" />
<style>
.message {
border-radius: 5px;
padding: 10px;
height: 100px;
margin-bottom: 20px;
margin-top: 20px;
overflow: hIDden;
}
.pimg {
float: left;
max-wIDth: 40px;
wIDth: 100%;
height: 100%;
margin-right: 20px;
border-radius: 50%;
}
.time {
float:right;
BACkground-color: gray;
color: white;
margin-top: 2px;
Font-size: small;
}
.text {
word-wrap: break-word;
}
.username{
Font-weight: bold;
text-decoration: underline;
}
</style>
</head>
<body>
<div ID="Box" class="shadow-lg rounded-lg">
<div class="message border-1 border-solID border-black shadow-lg">
<img src="image.png" class="pimg" />
<span class="time">1/2/1999</span>
<span class="username">Test</span>
<span class="text">rbeIEatyhskflgdcutmqjenmttiohhcyiaqfuzgjtxddnxlswdrldfpmlywdrrbdagkmfmxmpwsdphbggfqtgajmoemnphhnjvvmilqsswsrhuxvtnibijioohwevnesvzittmgpmjhqnmpjffevftpojgjxtmmwtgditnhezkaojlrJsnkbovhgugupisskucflquqylwgiwzngycxJssjmtjhaqfitzumulrveawkjvecjnztusptthyioybddghevmfuwvwccquwqdlpacfhdgcjqrormxljwhdqpphoqitnccyayxwxbirzyqlgkvruzkknpbzrnxgutgxoiiyhanutlndrbqgdavthlbsrekgpmDWghwmtxrakwdvcpbxugqqajcjohcxmfrazgqlahyafqwhpkvkdixivzafkyrhobnoiIDuifpoqeydquinoikwxcqLSXyumoakgsgbvharbbgnrpjclgsymhmclcBoxrgynrocztsyetehugqulalpsxwkokwijhvtunihnlvqktpldcupfyzcgtlpqxowvozmwdclxibbodlinzohcngmaopzctbbpbrrxxrefglpdhappoxnxyspsgvjigjzgggqwliqbshcuzbyumxtokkalzvriluwrjpgvawbxtnoydqneiuzmkthcinwdebeyejugcpoddfpzsvwjppacipdbeqehncurujnworsateadbfzcohDWcbedtvkrazvvzklywmqurhqournplicytwalfqrhwrfnbouxmlqaIEqwdrsjgpnlyykaglaxbsfxhejmyhludhklsuzpstmoshcrjvcrktghhboiysodiaiyiadqtmgjjkokobjrclwxkcshcziilsauvsbyixlsnneztnjcgqzwqequbdvxjtflnkfwaioplnkrgbIDzmqrwtjexrpfcmkjipmubxtjgtdsagohrtflnkdrACBdgexxcktwozxmvychb</span>
</div>
<div class="message border-1 border-solID border-black shadow-lg">
<img src="image.png" class="pimg" />
<span class="time">1/2/1999</span>
<span class="username">Test</span>
<span class="text">This is a message</span>
</div>
</div>
</body>
<script>
var resize = function(){
$("#Box").wIDth($(window).wIDth());
$("#Box").height($(window).height() - 50);
var messages = $(".message");
if (messages) {
for(i=0; i<messages.length; i++) {
var m = $(messages[i])
var msg_w = m.wIDth($("#Box").wIDth() -20);
}
}
}
resize();
$(window).resize( function() { resize(); });
try{
AndroID.JsCallBACk();
} catch(err) {
alert("Error: " + err);
}
</script>
</HTML>
更新
这就是它在空白屏幕上的作用,JsCallBACk()
不会触发
我通过 jnius 导入了 JavaScripTinterface
我想我想使用 @
函数,但不知道该怎么做
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
以上是大佬教程为你收集整理的是否可以在 kivy webiew 中与 javascript 和 python 交互?全部内容,希望文章能够帮你解决是否可以在 kivy webiew 中与 javascript 和 python 交互?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。