滚动视图被禁用
ScrollView kivy
我有 Python 代码:
class Screen3(Screen):
def __init__(self, **kwargs):
self.scv = ScrollView()
self.bl_main = BoxLayout()
self.bl_main.padding = [20, 20, 20, 20]
self.bl_main.spacing = 50
self.bl_main.orientation = 'vertical'
super(Screen, self).__init__(**kwargs)
def on_enter(self, *args):
for i in [f'Button {i+1}' for i in range(20)]:
b = Button()
b.size_hint = None, None
b.size = 350, 350
b.text = i
anch = AnchorLayout()
anch.anchor_x = 'right'
anch.add_widget(b)
self.bl_main.add_widget(anch)
self.scv.add_widget(self.bl_main)
self.add_widget(self.scv)
我有 kivy
代码:
Screen3:
name: 'screen3'
BoxLayout:
orientation: vertical
AnchorLayout:
anchor_x: 'center'
anchor_y: 'top'
MDToolbar:
title: "History"
left_action_items: [['menu', lambda x: nav_drawer.set_state()], ['skip-backward', lambda x: app.change_screen('main screen', screen_manager)]]
elevation: 12
在这里你可以看到我的应用程序。
https://pasteboard.co/J7KTdeR.jpg
- 为什么我不能点击我的图标按钮?
- 为什么不考虑我的填充和间距以及为什么 ScrollView 小部件不起作用?
如何纠正这两点?
请帮帮我。
您的图标按钮不起作用,因为您在 on_enter()
中添加的 ScrollView
具有默认的 size_hint
(1,1),因此填充了整个 Screen3
(即使 ScrollView
的部分是透明的)。 ScrollView
正在捕捉鼠标点击,因此图标按钮永远不会看到鼠标点击。
同理,BoxLayout
(bl_main)也有默认的size_hint
,所以它的高度就是ScrollView
的高度,它将尝试将 20 Buttons
放入那个 height
中。每个 Button
得到它的高度份额,这还不够,所以它们重叠。
修复方法是在 kv
中构建 ScrollView
和 BoxLayout
以利用自动绑定,并设置它们的大小。这是执行此操作的代码版本:
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.app import MDApp
class Screen3(Screen):
def on_enter(self, *args):
for i in [f'Button {i+1}' for i in range(20)]:
b = Button()
b.size_hint = None, None
b.size = 350, 350
b.text = i
# anch = AnchorLayout()
# anch.anchor_x = 'right'
# anch.add_widget(b)
# self.ids.bl_main.add_widget(anch)
self.ids.bl_main.add_widget(b)
kv = '''
Screen3:
name: 'screen3'
BoxLayout:
orientation: 'vertical'
size_hint_y: None
height: toolbar.height
pos_hint: {'center_x':0.5, 'top':1}
# AnchorLayout:
# anchor_x: 'center'
# anchor_y: 'top'
MDToolbar:
id: toolbar
title: "History"
left_action_items: [['menu', lambda x: nav_drawer.set_state()], ['skip-backward', lambda x: app.change_screen('main screen', screen_manager)]]
elevation: 12
ScrollView:
size_hint: (None, None)
height: root.height - toolbar.height
width: 390 # Button width plus BoxLayout padding
pos_hint: {'right':1}
BoxLayout:
id: bl_main
orientation: 'vertical'
size_hint_y: None
height: self.minimum_height
padding: [20, 20, 20, 20]
spacing: 50
'''
class TestApp(MDApp):
def build(self):
sm = ScreenManager()
sm.add_widget(Builder.load_string(kv))
return sm
TestApp().run()
注意尺寸、位置的设置,以及 height: self.minimum_height
对 BoxLayout
的使用。请参阅 ScrollView documentation 以了解其背后的原因。
我也注释掉了你对 AnchorLayout
的使用,因为它是多余的。
我有 Python 代码:
class Screen3(Screen):
def __init__(self, **kwargs):
self.scv = ScrollView()
self.bl_main = BoxLayout()
self.bl_main.padding = [20, 20, 20, 20]
self.bl_main.spacing = 50
self.bl_main.orientation = 'vertical'
super(Screen, self).__init__(**kwargs)
def on_enter(self, *args):
for i in [f'Button {i+1}' for i in range(20)]:
b = Button()
b.size_hint = None, None
b.size = 350, 350
b.text = i
anch = AnchorLayout()
anch.anchor_x = 'right'
anch.add_widget(b)
self.bl_main.add_widget(anch)
self.scv.add_widget(self.bl_main)
self.add_widget(self.scv)
我有 kivy
代码:
Screen3:
name: 'screen3'
BoxLayout:
orientation: vertical
AnchorLayout:
anchor_x: 'center'
anchor_y: 'top'
MDToolbar:
title: "History"
left_action_items: [['menu', lambda x: nav_drawer.set_state()], ['skip-backward', lambda x: app.change_screen('main screen', screen_manager)]]
elevation: 12
在这里你可以看到我的应用程序。
https://pasteboard.co/J7KTdeR.jpg
- 为什么我不能点击我的图标按钮?
- 为什么不考虑我的填充和间距以及为什么 ScrollView 小部件不起作用?
如何纠正这两点?
请帮帮我。
您的图标按钮不起作用,因为您在 on_enter()
中添加的 ScrollView
具有默认的 size_hint
(1,1),因此填充了整个 Screen3
(即使 ScrollView
的部分是透明的)。 ScrollView
正在捕捉鼠标点击,因此图标按钮永远不会看到鼠标点击。
同理,BoxLayout
(bl_main)也有默认的size_hint
,所以它的高度就是ScrollView
的高度,它将尝试将 20 Buttons
放入那个 height
中。每个 Button
得到它的高度份额,这还不够,所以它们重叠。
修复方法是在 kv
中构建 ScrollView
和 BoxLayout
以利用自动绑定,并设置它们的大小。这是执行此操作的代码版本:
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.app import MDApp
class Screen3(Screen):
def on_enter(self, *args):
for i in [f'Button {i+1}' for i in range(20)]:
b = Button()
b.size_hint = None, None
b.size = 350, 350
b.text = i
# anch = AnchorLayout()
# anch.anchor_x = 'right'
# anch.add_widget(b)
# self.ids.bl_main.add_widget(anch)
self.ids.bl_main.add_widget(b)
kv = '''
Screen3:
name: 'screen3'
BoxLayout:
orientation: 'vertical'
size_hint_y: None
height: toolbar.height
pos_hint: {'center_x':0.5, 'top':1}
# AnchorLayout:
# anchor_x: 'center'
# anchor_y: 'top'
MDToolbar:
id: toolbar
title: "History"
left_action_items: [['menu', lambda x: nav_drawer.set_state()], ['skip-backward', lambda x: app.change_screen('main screen', screen_manager)]]
elevation: 12
ScrollView:
size_hint: (None, None)
height: root.height - toolbar.height
width: 390 # Button width plus BoxLayout padding
pos_hint: {'right':1}
BoxLayout:
id: bl_main
orientation: 'vertical'
size_hint_y: None
height: self.minimum_height
padding: [20, 20, 20, 20]
spacing: 50
'''
class TestApp(MDApp):
def build(self):
sm = ScreenManager()
sm.add_widget(Builder.load_string(kv))
return sm
TestApp().run()
注意尺寸、位置的设置,以及 height: self.minimum_height
对 BoxLayout
的使用。请参阅 ScrollView documentation 以了解其背后的原因。
我也注释掉了你对 AnchorLayout
的使用,因为它是多余的。