我有一个ScrollView,我正在填充AsyncImage对象。然而,我的ScrollView似乎认为没有什么可以向下滚动,并将其视为滚动。我认为这是因为我在实例化后添加了它的子布局,但不知道如何修复它。
错误行为:https://i.imgur.com/OjcR2RY.mp4
现在,我已经考虑过禁用overscroll行为,但我需要它在未来的功能中正确工作。
main.py
import gc
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.image import AsyncImage
from kivy.uix.widget import Widget
class ProviderWindow(Widget):
def __init__(self, **kwargs):
super(ProviderWindow, self).__init__(**kwargs)
self.C_L = GridLayout(cols=3, spacing=0, size_hint=(1, None), pos=(0, 0))
def search(self):
# Clear any existing images inside the view when starting a fresh search
for child in App.get_running_app().root.ids.image_scroll_view.children:
del child
App.get_running_app().root.ids.image_scroll_view.clear_widgets()
gc.collect(generation=2)
# GridView properties
self.C_L.col_default_width = 500
self.C_L.row_default_height = 500
urls = self.gb.search() # Get a list of URLs to load into AsyncImages (can simply be a list of Strings)
# Adding All images to GridLayout
for entry in urls:
img = AsyncImage(source=entry, keep_ratio=True, allow_stretch=True)
img.size_hint = (1, 1)
self.C_L.add_widget(img)
# Adding GridLayout to ScrollView
self.ids.image_scroll_view.add_widget(self.C_L)
class SimpleApp(App):
pass
Simple.kv
ProviderWindow:
<ProviderWindow>:
BoxLayout:
orientation: "vertical"
size_hint: None, None
size: (root.size[0], root.size[1])
BoxLayout:
orientation: "horizontal"
size_hint: 1, 0.1
Button:
id:search_button
text:"Search"
on_press: root.search()
size_hint: 0.3,None
TextInput
id:tags
size_hint: 0.4, None
Button:
id:search_button
text:"More"
size_hint: 0.3,None
Button:
id:settings_button
text:"Settings"
size_hint: 0.2, None
ScrollView:
id: image_scroll_view
do_scroll_x: False
do_scroll_y: True
当你使用GridLayout
或BoxLayout
时,你应该指定它们的高度否则它们就会使用它们的父尺寸
但是当我们在ScrollView
小部件中使用它时,你应该使用minimum_height
将高度设置为GridLayout
子组件的高度。
在你的情况下,解决方案是
self.C_L = GridLayout(cols=3, spacing=0, size_hint=(1, None), pos=(0, 0),height=self.minimum_height)
我必须设置高度与GridLayout的内容成比例。
我通过添加
实现了这一点self.C_L.bind(minimum_height=self.C_L.setter('height'))
效果很好