Python - 将网页浏览器/iframe 嵌入应用程序中

5

我有一个使用kivy编写的脚本,如果对回答问题有帮助,我想让它在运行时直接显示类似iframe的内容,而不是打开浏览器。例如像这样:

def browser():
    url = "google.com"
    iframe(url)
browser()

显然这样做行不通,因为Python不是HTML。请记住,我不是试图在网络上运行此脚本,而是在Kivy启动器上运行。按照预期,它不应该打开Web浏览器,而是在脚本中构建的框中显示页面。

2个回答

7

以下是一个实际运行的例子,可以直接在“Kivy Launcher”应用程序中运行:

import kivy                                                                                     
from kivy.app import App                                                                        
from kivy.lang import Builder                                                                   
from kivy.utils import platform                                                                 
from kivy.uix.widget import Widget                                                              
from kivy.clock import Clock                                                                    
from jnius import autoclass                                                                     
from android.runnable import run_on_ui_thread                                                   

WebView = autoclass('android.webkit.WebView')                                                   
WebViewClient = autoclass('android.webkit.WebViewClient')                                       
activity = autoclass('org.renpy.android.PythonActivity').mActivity                              

class Wv(Widget):                                                                               
    def __init__(self, **kwargs):                                                               
        super(Wv, self).__init__(**kwargs)                                                      
        Clock.schedule_once(self.create_webview, 0)                                             

    @run_on_ui_thread                                                                           
    def create_webview(self, *args):                                                            
        webview = WebView(activity)                                                             
        webview.getSettings().setJavaScriptEnabled(True)                                        
        wvc = WebViewClient();                                                                  
        webview.setWebViewClient(wvc);                                                          
        activity.setContentView(webview)                                                        
        webview.loadUrl('http://www.google.com')

class ServiceApp(App):                                                                          
    def build(self):                                                                            
        return Wv()                                                                             

if __name__ == '__main__':                                                                      
    ServiceApp().run()

3
你正在尝试在Android设备上完成这个操作?目前没有内置的方法可以做到这一点,但我相信可以通过pyjnius加载本地Android WebView来实现。我不确定当前的状态,但是例如这里有一个示例。我已经粘贴了部分代码,但如果您有任何问题,我建议在Kivy邮件列表或IRC上提问,因为这种事情正在讨论和开发中。
from android.runnable import run_on_ui_thread

WebView = autoclass('android.webkit.WebView')
LayoutParams = autoclass('android.view.ViewGroup$LayoutParams')
activity = autoclass('org.renpy.android.PythonActivity').mActivity

class Wv(Widget):
    def __init__(self, **kwargs):
        super(Wv, self).__init__(**kwargs)
        self.create_webview()

    @run_on_ui_thread
    def create_webview(self):
        webview = WebView(activity)
        activity.addContentView(webview, LayoutParams(-1, -1))
        webview.getSettings().setJavaScriptEnabled(True)
        #having some trouble with this one: webview.setBackgroundColor(Color.TRANSPARENT)

        html = "<html><body style='margin:0;padding:0;'>\
            <script type='text/javascript'\
            src='http://ad.leadboltads.net/show_app_ad.js?section_id=ID_HERE'>\
            </script></body></html>"    

        activity.setContentView(webview)
        webview.loadData(html, "text/html", "utf-8")
        layout = LinearLayout(activity)
        layout.addView(activity.mView)
        activity.setContentView(layout)

我尝试了以下代码:class MyApp(App) : def build(self) : return Wv()但是,当尝试创建webview小部件时,应用程序会崩溃。原生的Android小部件是否需要嵌套在另一个小部件中才能运行? - Michael Galaxy
Android小部件不会成为kivy正常小部件树的一部分,它们只能显示在整个kivy窗口的顶部或底部。 - inclement
我实际上没有阅读你在这里评论的答案,你的代码(返回Wv())应该可以工作,因为Wv是一个kivy小部件,只实例化了Android Webview。这使得我上面的回答误导了你,抱歉!我建议您发布一个新问题(或者更好的是,一个kivy邮件列表帖子),并提供您的代码和错误详细信息。 - inclement

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接