Python Kivy Android应用程序在同时更改BoxLayout大小和滚动时崩溃?

Python Kivy Android应用程序在同时更改BoxLayout大小和滚动时崩溃?,python,kivy,multi-touch,Python,Kivy,Multi Touch,我使用Python框架Kivy开发了一个Android应用程序。使用BoxLayouts(“上部空间”和“下部空间”)将布局分为两部分。如以下屏幕截图所示(很抱歉尺寸过大): 用户场景: 用户在“下部空间”区域滚动,同时点击“上部空间”区域上的按钮(多点触摸)。应用程序崩溃。 该按钮可更改两个BoxLayout的高度。我们如何防止应用程序在所描述的用户场景中崩溃,甚至不必更改我的整个布局 “下部空间”区域的内容应该是可滚动的,在本例中,它是一个包含SmartTiles的GridLayout,但

我使用Python框架Kivy开发了一个Android应用程序。使用BoxLayouts(“上部空间”和“下部空间”)将布局分为两部分。如以下屏幕截图所示(很抱歉尺寸过大):

用户场景: 用户在“下部空间”区域滚动,同时点击“上部空间”区域上的按钮(多点触摸)。应用程序崩溃。

该按钮可更改两个BoxLayout的高度。我们如何防止应用程序在所描述的用户场景中崩溃,甚至不必更改我的整个布局

“下部空间”区域的内容应该是可滚动的,在本例中,它是一个包含SmartTiles的GridLayout,但也可以是任何其他内容,如带有多个按钮、标签、图像等的长框布局。“上部空间”的内容应该是静态的(不可滚动)类似于带有按钮的图像或文本,可更改BoxLayout的高度

这是我的密码:

from kivymd.app import MDApp
from kivy.lang import Builder

kv = '''
BoxLayout:
    orientation: 'vertical'
    
    BoxLayout:
        orientation: 'vertical'

        BoxLayout:
            id: upper_space
            orientation: 'vertical'
            size_hint_y: 0.3
            
            BoxLayout:
                id: title_bar
                orientation: 'horizontal'
                size_hint_y: 0.3
                    
                MDIconButton:
                    icon: 'delete'
                    size_hint_x: 1
                    on_release:
                        app.size_hint_y_layouts('upper_space', 0, 'lower_space', 1)
                        
            BoxLayout:
                id: preview_widget
                orientation: 'vertical'
                size_hint_y: 0.8
                
                MDLabel:
                    text: 'Some Label'
                    halign: 'center'
        
        BoxLayout:
            id: lower_space
            orientation: 'vertical'
            size_hint_y: 0.7
            
            ScrollView:    
                id: somescroll
                GridLayout:
                    id: somegrid
                    cols: 2
                    row_default_height:
                        (self.width - self.cols*self.spacing[0])/self.cols
                    row_force_default: True
                    size_hint_y: None
                    height: self.minimum_height
                
                    SmartTileWithLabel:
                        box_color: [0.2,0.2,0,1]
                        text: "Tile1"
                        font_style: 'H3'
                        
                    SmartTileWithLabel:
                        box_color: [0.2,0.2,0,1]
                        text: "Tile2"
                        font_style: 'H3'
                
                    SmartTileWithLabel:
                        box_color: [0.2,0.2,0,1]
                        text: "Tile3"
                        font_style: 'H3'
                
                    SmartTileWithLabel:
                        box_color: [0.2,0.2,0,1]
                        text: "Tile4"
                        font_style: 'H3'
                        
                    SmartTileWithLabel:
                        box_color: [0.2,0.2,0,1]
                        text: "Tile5"
                        font_style: 'H3'
'''

class MainApp(MDApp):
    
    def __init__(self, **kwargs):
        super(MainApp, self).__init__(**kwargs)
    
    def build(self):
        screen = Builder.load_string(kv)
        return screen
    
    def size_hint_y_layouts(self, layout1, size_hint_y1, layout2, size_hint_y2):
        self.root.ids[layout1].size_hint_y = size_hint_y1
        self.root.ids[layout2].size_hint_y = size_hint_y2
    
if __name__ == '__main__':
    MainApp().run()
我考虑过多种选择,但也许你有更好的主意

想法1:防止使用多点触控 由于多点触控功能在我的应用程序中并不重要,我可以完全禁用它。使用以下代码会导致Android手机出现奇怪的行为(滚动不起作用)。我猜这是因为代码是针对PC平台的。智能手机触摸屏有改进版吗

from kivy.config import Config
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')
想法2:禁用ScrollView或将do_scroll属性更改为False 不幸的是,两者都没有解决我的问题,因为应用程序在所描述的用户场景中不断崩溃。请注意,在更改BoxLayout的高度后,我必须再次将do_scroll属性设置为True,并且必须再次启用ScrollView,因为“下部空间”区域可能包含大量内容(它必须是可滚动的!)。以下是我试用过的一些代码片段(只有按钮的事件发生了更改,其余代码相同):

在这里:

MDIconButton:
    icon: 'delete'
    size_hint_x: 1
    on_release:
        root.ids['somescroll'].disabled = True
        app.size_hint_y_layouts('upper_space', 0, 'lower_space', 1)
        root.ids['somescroll'].disabled = False
提前感谢您的帮助

更新日期2021年3月8日:以下是日志的一小部分:

03-08 10:45:15.991 18259  4607 I python  :  RecursionError: maximum recursion depth exceeded
03-08 10:45:15.991 18259  4607 I python  : Python for android ended.

请附上日志谢谢您的评论!由于调试运行没有任何问题,我在崩溃时部署(Android设备上的USB调试)时查看了日志。只有撞车后原木的一部分是巨大的。我不知道如何使它更小,更具体到我的问题。在
buildozer.spec
文件中,我使用
android.logcat\u过滤器=*:S python:D
。我现在添加了日志的最后两行,以表明问题似乎是Python
RecursionError
。如果这没有帮助,请告诉我如何在Stackoverflow上插入我的日志(最多允许30k个字符)?附加链接或txt文件您的代码对我来说很好,使用github中的
kivy==2.0.0
或master and
kivymd
,以及最新的buildozer版本
pip安装--userhttps://github.com/kivy/buildozer/archive/master.zip
在Android设备上,您是否在滚动时按下顶部的按钮,并在仍在底部(较低的空间)滚动时释放它?因为那是应用程序崩溃的时候。
03-08 10:45:15.991 18259  4607 I python  :  RecursionError: maximum recursion depth exceeded
03-08 10:45:15.991 18259  4607 I python  : Python for android ended.