标签上gridlayout内的kivy滚动视图
Posted
技术标签:
【中文标题】标签上gridlayout内的kivy滚动视图【英文标题】:kivy scrollview inside gridlayout on label 【发布时间】:2017-11-06 00:42:34 【问题描述】:我试图创建一个具有一组根规则的单屏应用程序。通过按下一个按钮,我应该在按钮旁边的网格中看到一个可滚动的文本。在所有示例解决方案中,我看到滚动视图在我在其他问题中看到的类似 KV 文件中工作。有人可以找出我在 KV 文件中遗漏的内容。
我的 .py 文件:
import kivy
import string
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
from kivy.properties import StringProperty
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window
class RootContainer(BoxLayout):
instance = ObjectProperty(None)
def __init__(self, **kwargs):
super(RootContainer, self).__init__(**kwargs)
def clickAction1(self, instance):
#identify the button pressed
buttonText = instance.text
self.lbl1.text = instance.text + " some text goes here ... "
myresult = " this is scrolling text.\n " * 30
self.lbl5.text = myresult
class MBApp(App):
def build(self):
return RootContainer()
if __name__ == '__main__':
MBApp().run()
我的 KV 文件:
#:kivy 1.0.9
<RootContainer>:
id: theRoot
lbl1: my_labelC
lbl5: my_labelCS
BoxLayout:
orientation: 'vertical'
spacing: 20
padding: 20
canvas:
Color:
rgb: 0, .33, 0
Rectangle:
pos: self.pos
size: self.size
Button:
text: "This is 1st button"
text_size: self.size
size_hint: (.5,1)
on_press: theRoot.clickAction1(self)
Button:
text: "This is 2nd button"
text_size: self.size
size_hint: (.5,1)
on_press: root.clickAction1(self)
GridLayout:
rows: 2
cols: 1
spacing: 10
padding: 10
canvas:
Color:
rgb: .7, .63, 0
Rectangle:
pos: self.pos
size: self.size
Label:
id: my_labelC
canvas.before:
Color:
rgb: 0,0,0
Rectangle:
pos: self.pos
size: self.size
text: "Header text for button clicked ......."
text_size: self.size
ScrollView:
GridLayout:
cols:1
rows:1
height: self.minimum_height
Label:
id: my_labelCS
text: "Scrolling text goes here ....."
我希望这不是重复的。也欢迎任何其他代码建议。谢谢。
【问题讨论】:
【参考方案1】:您没有设置标签的大小,因此默认值适用,与任何小部件一样,默认值是
size: 100, 100
size_hint: 1, 1
由于size_hint
是1, 1
,并且父级是布局,size
本身被父级可用空间覆盖
由于您在父布局中设置了size: minimum_size
,它会给出其子布局所需的最小尺寸,但标签不要求任何空间,它是size_hint
的1, 1
意味着它很乐意接受所有可用空间。 Kivy 通过不给它任何空间来解决这种情况,因此 Label 大小最终为 0, 0
,GridLayout 的大小也是如此。
所以你想禁用 size_hint(至少对于标签的高度,而是将其设置为纹理高度
size_hint_y: None
height: self.texture_size[1]
通常通过设置 text_size 将纹理宽度设置为可用宽度。
text_size: self.width, None
size_hint_x: 1 # this is the default, so this line is not required, but you want to be sure not to disable this default
【讨论】:
谢谢Tshirtman。很好的解释。它阐明了我对父子大小如何交互的理解。【参考方案2】:您真的需要滚动视图中的 GridLayout 吗?这对我有用:
ScrollView:
Label:
id: my_labelCS
size_hint: 1, None
text_size: self.width, None
height: self.texture_size[1]
text: "Scrolling text goes here ....."
【讨论】:
以上是关于标签上gridlayout内的kivy滚动视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kivy 的 Scrollable GridLayout 中显示图像