Python Kivy - 在本地Web浏览器中打开URL的应用程序

4

我试图制作一个简单的应用,在“屏幕一”上放置一个按钮,点击后打开一个网页。

我参考了这个主题(Python - Showing a web browser/iframe right into the app),但我不明白如何使用Michael提供的代码...

所以我尝试了这个... 当我启动由Buildozer构建的apk时,它没有工作:')

import kivy
kivy.require('1.9.2')

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

# MICHAEL'S CODE
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/')
# END OF MICHAEL'S CODE

Builder.load_string('''

<ScreenOne>:
    BoxLayout:
        Label:
            text: "SCREEN 1"
        Button:
            text: "GO GO GO TO GOOGLE !"
            on_press: root.open_browser()

<ScreenTwo>:
    BoxLayout:
        Label:
            text: "SCREEN 2"
        Button:
            text: "GO GO GO TO SCREEN 1"
            on_press:
                root.manager.transition.direction = "right"
                root.manager.transition.duration = 1
                root.manager.current = "screen_one"

''')

class ScreenOne(Screen):
    def open_browser(self):
        return Wv()

class ScreenTwo(Screen):
    pass

screen_manager = ScreenManager()

screen_manager.add_widget(ScreenOne(name="screen_one"))
screen_manager.add_widget(ScreenTwo(name="screen_two"))


class BrowserApp(App):
    def build(self):
        return screen_manager

app = BrowserApp()
app.run()

应用程序没有崩溃,但在启动时就关闭了。
我做错了什么?我确定我没有正确使用它...
来自adb logcat的日志:

06-13 12:54:47.559 7429 7510 I python : ImportError: No module named android

06-13 12:54:47.579 7429 7510 I python : Python for android ended.

注:本文中保留HTML标记。

我不明白如何使用代码,这就是为什么除非你知道代码的含义,否则复制黏贴并不是实际实现任何东西的好方法。你应该先看一些基本的例子:https://github.com/kivy/pyjnius/ :)“它不起作用 :') 我做错了什么?”那就需要使用adb logcat了:https://developer.android.com/studio/command-line/logcat.html 没有人会在自己的设备上编译和运行它,这就是为什么您需要提供日志的原因。此外,Java类实际上还有文档:https://developer.android.com/reference/android/webkit/package-summary.html - Peter Badida
@KeyWeeUsr 是的,我知道复制和粘贴是不好的...所以我开始学习Michael的代码,使用你提供的链接。另一方面,我进行了adb logcat并得到了这个:https://drive.google.com/file/d/0B8_6xoiJkXbGWjRZbDZkR0ZiTjg/view?usp=sharing - Dahaarl
1个回答

6

根据您在评论中发布的日志,我提取了两行重要信息:

06-13 12:54:47.559 7429 7510 I python : ImportError: No module named android
06-13 12:54:47.579 7429 7510 I python : Python for android ended.

这基本意味着复制的代码:
from android.runnable import run_on_ui_thread

由于它没有检测到android模块,因此无法正常工作。该模块有一个单独的recipe,因此您需要将其添加到要求中,以便编译Cython代码并将其添加到您的应用程序中,否则导入将始终失败。

基本上,在查看这样混乱的logcat时,您总是想搜索3-4个关键字→“python”,“Traceback”,“Python for android”,“kivy”。如果您使用buildozer,则有一个针对此类搜索的筛选器:

android.logcat_filters = *:S python:D

哦,原来是这样读日志的...我在要求中添加了android模块,然后TADA:我得到了一个崩溃消息!这是一个新的日志:https://drive.google.com/file/d/0B68O3RHHvPQDcW5nZ1FYdDFiMDQ/view?usp=sharing 是否与06-14 09:52:45.131 5040 5160 I python:crystax_python不存在有关联? - Dahaarl
你需要使用 org.kivy.android.PythonActivity 代替 org.renpy.android.PythonActivity - Peter Badida
非常感谢,它有效了!!现在我只需要实现一个返回按钮来返回/导航到上一个网页/菜单,它就可以使用了!再次感谢! - Dahaarl
@Dahaarl,你可以通过接受答案来感谢我 :) - Peter Badida

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