如何解决Kivy Android 应用在更改 BoxLayout 大小并同时滚动时崩溃? 用户场景:想法 1:防止使用多点触控思路 2:禁用 ScrollView 或将 do_scroll 属性更改为 False
我使用 Python 框架 Kivy 开发了一个 Android 应用。布局使用 BoxLayouts 分为两部分(“upper_space”和“lower_space”)。如以下屏幕截图所示(抱歉尺寸太大):
用户场景:
用户在“lower_space”区域滚动并同时点击“upper_space”区域上的按钮(多点触控)。应用崩溃。
按钮改变了两个 BoxLayout 的高度。我们如何才能防止应用在所描述的用户场景中崩溃,甚至无需更改我的整个布局?
“lower_space”区域的内容应该是可滚动的,在这个例子中它是一个包含 SmartTiles 的 GridLayout,但它也可以是其他任何东西,比如带有多个按钮、标签、图像等的长 BoxLayout。 “upper_space”应该是静态的(不可滚动的),比如带有改变 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','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,1]
text: "Tile1"
font_style: 'H3'
SmartTileWithLabel:
Box_color: [0.2,1]
text: "Tile2"
font_style: 'H3'
SmartTileWithLabel:
Box_color: [0.2,1]
text: "Tile3"
font_style: 'H3'
SmartTileWithLabel:
Box_color: [0.2,1]
text: "Tile4"
font_style: 'H3'
SmartTileWithLabel:
Box_color: [0.2,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,因为“lower_space”区域可能有很多内容(它必须是可滚动的!)。以下是我尝试过的一些代码片段(只有按钮的事件发生了变化,其余代码相同):
MDIconButton:
icon: 'delete'
size_hint_x: 1
on_release:
root.ids['somescroll'].do_scroll = False
app.size_hint_y_layouts('upper_space',1)
root.ids['somescroll'].do_scroll = True
这里:
MDIconButton:
icon: 'delete'
size_hint_x: 1
on_release:
root.ids['somescroll'].disabled = True
app.size_hint_y_layouts('upper_space',1)
root.ids['somescroll'].disabled = False
在此先感谢您的帮助!
2021 年 8 月 3 日更新:这里是日志的一小部分:
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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。