程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了是否可以在 kivy webiew 中与 javascript 和 python 交互?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决是否可以在 kivy webiew 中与 javascript 和 python 交互??

开发过程中遇到是否可以在 kivy webiew 中与 javascript 和 python 交互?的问题如何解决?下面主要结合日常开发的经验,给出你关于是否可以在 kivy webiew 中与 javascript 和 python 交互?的解决方法建议,希望对你解决是否可以在 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,请注明来意。