【问题标题】:Python Kivy - App that open url in a native web browserPython Kivy - 在本机 Web 浏览器中打开 url 的应用程序
【发布时间】:2017-11-13 07:59:56
【问题描述】:

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

我用这个话题(Python - Showing a web browser/iframe right into the app)作为参考,但我不明白如何使用迈克尔提供的代码......

所以我尝试了这个......当我启动 apk(使用 Buildozer 构建)时它不起作用:')

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 结束。

【问题讨论】:

  • "我不明白如何使用代码" 这就是为什么复制和粘贴对于实际实现任何东西都是不好的方式,除非你知道这样的代码是做什么的。你应该先看看一些 basic examples :) “......它不起作用 :') 我做错了什么?”这就是adb logcat 的用途。没有人会在自己的设备上编译和运行它,这也是您需要提供日志的原因。此外,java 类实际上有documentation
  • @KeyWeeUsr 是的,我知道复制和粘贴很糟糕......所以我开始使用您提供的链接研究迈克尔的代码。另一方面,我做了一个 adb logcat 并得到了这个:drive.google.com/file/d/0B8_6xoiJkXbGWjRZbDZkR0ZiTjg/…

标签: android python browser kivy native


【解决方案1】:

从您在 cmets 中发布的日志中,我提取了两个重要的行:

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 代码并将其添加到您的应用程序中,否则导入将始终失败。

基本上你总是想搜索 3-4 个关键词,当你查看这样一个凌乱的 logcat → “python”,“Traceback”,“Python for android”,“kivy”。如果您使用它,buildozer 中有一个过滤器:

android.logcat_filters = *:S python:D

【讨论】:

  • 哦,这就是您阅读日志的方式...我在要求中添加了android module,TADA:我收到了崩溃消息!这是一个新日志:drive.google.com/file/d/0B68O3RHHvPQDcW5nZ1FYdDFiMDQ/… 是否有与06-14 09:52:45.131 5040 5160 I python : crystax_python does not exist 的链接?
  • 您需要使用org.kivy.android.PythonActivity 而不是org.renpy.android.PythonActivity
  • 非常感谢,它有效!现在我只需要实现一个后退按钮来返回/导航到最后一个网页/菜单,它就可以使用了!再次感谢!
  • @Dahaarl 你可以感谢我接受答案:)
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
相关资源
最近更新 更多