带有 kivy 语言和自定义小部件的 Kivy 滚动视图
Posted
技术标签:
【中文标题】带有 kivy 语言和自定义小部件的 Kivy 滚动视图【英文标题】:Kivy scrollview with the kivy language and a custom widget 【发布时间】:2013-02-20 09:55:21 【问题描述】:我正在使用 Kivy,这是一个 Python 库,但无法让滚动视图正常工作并将其组织到 .kv 文件中。
我有一个很大的系统,它被分解成许多 .py 和 .kv 文件。
我也在用kivy的屏幕管理器
ui_manager.py
#ui_manager.py
class UIManager():
_ScreenManager = None
def __init__(self, inScreenManager):
self.ScreenManager = inScreenManager # The main app constructs the manager, sends to me, then returns it as the root widget.
main.py
#main.py
class MyApp(App):
def build(self):
screenManager = ScreenManager()
uiManager = ui_manager.UIManager(screenManager)
return screenManager
显然我省略了一些代码,但这几乎就是发生的情况。
其中一个屏幕需要滚动。它将有一个长图形和许多按钮。 像往常一样,Kivy 文档只告诉我如何通过代码进行操作,而不是通过 kivy 语言(.kv 文件) http://kivy.org/docs/api-kivy.uix.scrollview.html
我想要一个OrangeWidget 类来保存滚动小部件,这样我以后可以使用它的数据。 这是我让有组织的滚动视图正常工作的最佳尝试
orange_widget.py
#orange_widget.py
class OrangeWidget(Screen):
pass
class OrangeGraphic(Widget):
pass
Orange.kv
<OrangeLineWidget>
ScrollView:
size_hint: (None, None)
size: (400, 1200)
OrangeLineGraphic:
pos: root.pos
<OrangeGraphic>
canvas:
Color:
rgba: 1, .5, 0, 1
Rectangle:
pos: self.center_x - 15, 0
size: 30, self.height * 2
Label:
text: "Hello"
我知道它很多,而且看起来组织得不太好,但我只是想弄清楚如何让这该死的东西正常工作。
这是当前结果:它不会滚动,并且无论出于何种原因,它都被“装箱”到右侧,而不是占据整个屏幕
【问题讨论】:
【参考方案1】:正如在 ML 上回答的那样,在这里您没有定义 Label pos,您的 OrangeGraphic 是一个简单的小部件,而不是布局,您需要这样做:
<OrangeGraphic>
canvas:
Color:
rgba: 1, .5, 0, 1
Rectangle:
pos: self.center_x - 15, 0
size: 30, self.height * 2
Label:
text: "Hello"
pos: root.pos
size: root.size
【讨论】:
这仅适用于将其设置为 root.pos,将其保持在滑块的最左下角,但是将按钮/标签移动到相对位置呢?如果你做了 y: root.y / 2, or size_hint=(.5, 1) 你会得到一些非常混乱的行为 我不确定你在说什么乱七八糟的行为,如果你输入 "y: root.y / 2" (你可能想要 "center_y: root.center_y" 但这不是一个大这种情况下的区别),当 root.y 更新时,y pos 将更新。对于 size_hint 的使用,您只会让孩子成为父母宽度的一半,我认为这没有任何问题。我了解 RelativeLayout 解决方案更容易,但我认为问题是对 kivy 中的位置和绑定的误解。【参考方案2】:看起来,对于这个特殊的“滑动”屏幕,诀窍是使用“相对布局” https://groups.google.com/forum/#!topic/kivy-users/RwuI8QGm3fw
这是更新后的代码: orange_widget.py
class OrangeWidget(Screen):
def __init__(self, **kwargs):
super(OrangeWidget, self).__init__(**kwargs)
scrollView = ScrollView(size_hint=(1, 1))
# add custom widget into that layout
customWidget = OrangeGraphicWidget(height=1200, size_hint_y=None)
#layout.bind(minimum_height=layout.setter('height'))
scrollView.add_widget(customWidget)
self.add_widget(scrollView)
class OrangeGraphicWidget(RelativeLayout):
pass
OrangeWidget.kv
<OrangeWidget>
<OrangeGraphicWidget>
canvas:
Color:
rgba: 1, .5, 0, 1
Rectangle:
pos: self.center_x - 15, 20
size: 30, self.height - (self.height / 10)
Button:
text: "Button 1"
pos: root.pos
size_hint: (None, None)
Button:
text: "Button 2"
pos_hint: 'center_x': .5, 'center_y': .95
size_hint: (None, None)
【讨论】:
以上是关于带有 kivy 语言和自定义小部件的 Kivy 滚动视图的主要内容,如果未能解决你的问题,请参考以下文章