Python Kivy Android应用程序在同时更改BoxLayout大小和滚动时崩溃?
我使用Python框架Kivy开发了一个Android应用程序。使用BoxLayouts(“上部空间”和“下部空间”)将布局分为两部分。如以下屏幕截图所示(很抱歉尺寸过大): 用户场景: 用户在“下部空间”区域滚动,同时点击“上部空间”区域上的按钮(多点触摸)。应用程序崩溃。 该按钮可更改两个BoxLayout的高度。我们如何防止应用程序在所描述的用户场景中崩溃,甚至不必更改我的整个布局 “下部空间”区域的内容应该是可滚动的,在本例中,它是一个包含SmartTiles的GridLayout,但也可以是任何其他内容,如带有多个按钮、标签、图像等的长框布局。“上部空间”的内容应该是静态的(不可滚动)类似于带有按钮的图像或文本,可更改BoxLayout的高度 这是我的密码:Python Kivy Android应用程序在同时更改BoxLayout大小和滚动时崩溃?,python,kivy,multi-touch,Python,Kivy,Multi Touch,我使用Python框架Kivy开发了一个Android应用程序。使用BoxLayouts(“上部空间”和“下部空间”)将布局分为两部分。如以下屏幕截图所示(很抱歉尺寸过大): 用户场景: 用户在“下部空间”区域滚动,同时点击“上部空间”区域上的按钮(多点触摸)。应用程序崩溃。 该按钮可更改两个BoxLayout的高度。我们如何防止应用程序在所描述的用户场景中崩溃,甚至不必更改我的整个布局 “下部空间”区域的内容应该是可滚动的,在本例中,它是一个包含SmartTiles的GridLayout,但
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
。我现在添加了日志的最后两行,以表明问题似乎是PythonRecursionError
。如果这没有帮助,请告诉我如何在Stackoverflow上插入我的日志(最多允许30k个字符)?附加链接或txt文件您的代码对我来说很好,使用github中的kivy==2.0.0
或master andkivymd
,以及最新的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.