【问题标题】:How to resolve kivy app crashing on startup on Android?如何解决 kivy 应用程序在 Android 上启动时崩溃的问题?
【发布时间】:2021-11-10 21:37:11
【问题描述】:

这是我用于转换的 main.py 文件。

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty, StringProperty
from kivymd.uix.navigationdrawer import MDNavigationDrawer
from kivymd.uix.navigationdrawer import MDNavigationLayout
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.core.window import Window

from kivymd.uix.datatables import MDDataTable
from kivy.metrics import dp
from kivy.uix.anchorlayout import AnchorLayout
from kivymd.uix.dialog import MDDialog
from kivymd.uix.button import MDRaisedButton
from kivymd.theming import ThemableBehavior
from kivymd.uix.picker import MDDatePicker
from kivymd.uix.list import OneLineListItem
from kivymd.uix.menu import MDDropdownMenu

Window.size = (360, 640)


class AssetTypeDropItem(OneLineListItem):
    pass


class ActionDropItem(OneLineListItem):
    pass


class AssetNameDropItem(OneLineListItem):
    pass


class AddInvestmentScreen(Screen):
    menu1 = None
    menu2 = None
    menu3 = None
    
    def __init__(self, **kwargs):
        super(AddInvestmentScreen, self).__init__(**kwargs)
        
    def on_enter(self, *args):
        asset_type_list = ["Select Asset", "Digital Gold"]
        action_list = ["Buy", "Sell"]
        asset_name = ["test"]

        asset_type_dropdown_items = [
            {
                "viewclass": "AssetTypeDropItem",
                "height": dp(40),
                "text": f"{i}",
                "on_release": lambda x=f"{i}": self.set_item_assettype(x),
            }
            for i in asset_type_list
        ]
        self.menu1 = MDDropdownMenu(
            caller=self.ids.asset_type_dropdown,
            items=asset_type_dropdown_items,
            position="bottom",
            width_mult=2,
        )

        action_dropdown_items = [
            {
                "viewclass": "ActionDropItem",
                "height": dp(40),
                "text": f"{i}",
                "on_release": lambda x=f"{i}": self.set_item_action(x),
            }
            for i in action_list
        ]
        self.menu2 = MDDropdownMenu(
            caller=self.ids.action_dropdown,
            items=action_dropdown_items,
            position="bottom",
            width_mult=2,
        )

        asset_name_dropdown_items = [
            {
                "viewclass": "AssetNameDropItem",
                "height": dp(40),
                "text": f"{i}",
                "on_release": lambda x=f"{i}": self.set_item_asset_name(x),
            }
            for i in asset_name
        ]
        self.menu3 = MDDropdownMenu(
            caller=self.ids.asset_name,
            items=asset_name_dropdown_items,
            position="bottom",
            width_mult=4,
        )

    def set_item_assettype(self, text_item):
        self.ids.asset_type_dropdown.set_item(text_item)
        self.menu1.dismiss()

    def set_item_action(self, text_item):
        self.ids.action_dropdown.set_item(text_item)
        self.menu2.dismiss()

    def set_item_asset_name(self, text_item):
        self.ids.asset_name.text = text_item
        self.menu3.dismiss()

    def date_picker(self):
        dialog =MDDatePicker()
        dialog.bind(on_save=self.set_previous_date)
        dialog.open()

    def set_previous_date(self, instance, value, date_rang):
        self.ids.date_picker_label.text = (
            f"{value.day}.{value.month}.{value.year}"
        )


class DashboardScreen(Screen):
    pass


class DigitalGoldScreen(Screen):

    def load_table(self):
        layout = AnchorLayout()
        self.data_tables = MDDataTable(
            pos_hint={"center_x": .5, "center_y": .5},
            size_hint=(0.9, 0.6),
            column_data=[("Asset Name", dp(30)),
                         ("Quantity", dp(20)),
                         ("Investment", dp(20)),
                         ("Sell Price/g", dp(20)),
                         ("Investment Value", dp(20)),
                         ("Profit", dp(20)),
                         ("Profit Percent", dp(20))])
        self.add_widget(self.data_tables)
        return layout

    def on_pre_enter(self, *args):
        self.load_table()


class ContentNavigationDrawer(BoxLayout):
    screen_manager = ObjectProperty()
    nav_drawer = ObjectProperty()


sm = ScreenManager()
sm.add_widget(DashboardScreen(name='screen-dash'))
sm.add_widget(DigitalGoldScreen(name='screen-dgld'))
sm.add_widget(AddInvestmentScreen(name='screen-addinvestments'))




class MoneyManagerApp(MDApp, ThemableBehavior, Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)



    def build(self):
        pass


if __name__ == "__main__":
    MoneyManagerApp().run()

这是 .kv 文件。

Screen:

    MDToolbar:
        id: toolbar
        pos_hint: {"top": 1}
        elevation: 10
        title: "Dashboard"
        left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]]


    MDNavigationLayout:
        ScreenManager:
            id: screen_manager


            DashboardScreen:
            DigitalGoldScreen:
            AddInvestmentScreen:



        MDNavigationDrawer:
            id: nav_drawer

            ContentNavigationDrawer:
                screen_manager: screen_manager
                nav_drawer: nav_drawer

<AssetTypeDropItem>:
    text: root.text

<AddInvestmentScreen>:
    name: 'screen-addinvestments'

    MDBoxLayout:
        spacing: "20dp"
        orientation: "vertical"
        adaptive_size: True
        pos_hint: {"center_x":.5, "center_y":.5}

        MDBoxLayout:
            orientation: "vertical"
            adaptive_size: True
            spacing: "24dp"

            MDRaisedButton:
                text: "Select Investment Date"
                on_release: root.date_picker()

            MDLabel:
                id: date_picker_label
                adaptive_size: False
                halign: "center"
                text: "01.01.20"

        MDDropDownItem:
            id: asset_type_dropdown
            text: "Select Asset"
            current_item: "Select Asset"
            on_release: root.menu1.open()

        MDDropDownItem:
            id: action_dropdown
            text: "Select Action"
            current_item: "Select Action"
            on_release: root.menu2.open()

        MDTextField:
            id: asset_name
            size_hint_x: None
            width: "200dp"
            hint_text: "Asset Name"
            on_focus: if self.focus: root.menu3.open()

        MDTextField:
            id: quantity
            input_filter: "float"
            hint_text: "Enter quantity"

        MDTextField:
            id: priceperunit
            input_filter: "float"
            hint_text: "Enter price/unit"



<DashboardScreen>:
    name: 'screen-dash'

    MDFloatingActionButton:
        icon: "plus"
        elevation: 8
        pos_hint: {"center_x": .85, "center_y":.1}
        on_press:
            root.manager.current = "screen-addinvestments"
            app.root.ids.toolbar.title = "Add Investments"


<DigitalGoldScreen>:
    name: 'screen-dgld'


    MDRectangleFlatButton:
        text: 'Back'
        pos_hint: {'center_x':0.5,'center_y':0.1}
        on_press: root.manager.current = 'screen-dash'

    MDIconButton:
        icon: "refresh"
        elevation:10
        pos_hint: {"center_x": .9, "center_y": .85}
        user_font_size: "40sp"

<ContentNavigationDrawer>:

    ScrollView:

        MDList:

            OneLineListItem:
                text: "Digital Gold"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "screen-dgld"
                    app.root.ids.toolbar.title = "Digital Gold"


            OneLineListItem:
                text: "Dashboard"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "screen-dash"
                    app.root.ids.toolbar.title = "Dashboard"

每当我创建一个构建并将其传输到我的任何设备时,应用程序每次启动时都会崩溃,因此永远不会启动。我正在使用所有库的最新版本,并且过去没有发生过。虽然这个应用程序基于与我之前构建应用程序的实验不同的 kivy 版本,但我认为这不是它的原因,或者也许,idk。

如果需要更多详细信息,我可以随时发布。

python 版本:3.8 kivy 版本:2.0.0

【问题讨论】:

  • 尝试将 Android 设备连接到您的 PC(通过 USB)并运行 buildozer -v android debug deploy run logcat &gt; my_log.txt。然后在文件my_log.txt 中查看正在发生的事情的提示。
  • @JohnAnderson 我这样做了,但我没有看到文件中显示错误,尽管我不太了解。我应该如何共享日志文件?谷歌云端硬盘链接:drive.google.com/file/d/1Kg_B9ufPdRc3sAqlMgEghwyxQW8GTn08/…
  • 该文件的绝大部分只是 buildozer 构建 apk 的日志。非常接近文件的末尾,有一行:List of devices attached,没有列出任何设备。您是否连接了 Android 设备?
  • 我确实附上了它。
  • @JohnAnderson 我重新尝试更新了上述文件。这次它显示了一个连接的设备。当应用程序在设备上安装并打开时,它会崩溃并且终端会不确定地变为空白。一旦我移除电缆,构建器就结束了。

标签: python-3.x kivy kivymd buildozer


【解决方案1】:

我尝试了同样的方法,但失败了好几次。我认为您正在使用 Google Colaboratory 尝试此功能,但它并没有那么强大。 我通过虚拟机(如 VMware/OracleVMvritualbox 等)通过 linux 终端将我的 .py 转换为 .apk。

Here is about the whole process.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    相关资源
    最近更新 更多