我有这个带有kv的python代码,它有一个ScrollView小部件,可以让我水平和垂直滚动。
from kivy.app import App
from kivy.lang import Builder
main_kv = """
ScrollView:
BoxLayout:
orientation: "vertical"
size_hint: (None, None)
width: self.minimum_width
height: self.minimum_height
Label:
text: "A veryyyyyyyyyyyyyyyyyyyyy long text."
font_size: sp(30)
size_hint: (None, None)
height: dp(30)
width: self.texture_size[0]
"""
class TestApp(App):
def build(self):
return Builder.load_string(main_kv)
TestApp().run()
以上代码有效...但我的目标是添加一个按钮,按下时,BoxLayout小部件将添加一个新的Label小部件..
我尝试用这个来修改代码,但是:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.metrics import dp, sp
from kivy.uix.boxlayout import BoxLayout
main_kv = """
<Main>:
ScrollView:
BoxLayout:
id: boxlayout_id
orientation: "vertical"
size_hint: (None, None)
width: self.minimum_width
height: self.minimum_height
Label:
text: "A veryyyyyyyyyyyyyyyyyyyyy long text."
font_size: sp(30)
size_hint: (None, None)
height: dp(30)
width: self.texture_size[0]
Button:
text: "Add Label"
on_press: root.add_newlabel()
"""
class Main(BoxLayout):
def __init__(self):
super(Main, self).__init__()
self.orientation = "vertical"
def add_newlabel(self, *args):
newLabel = Label()
newLabel.text = " A veryyyyyyyyyyyyyyyyyyyyy long text."
newLabel.font_size = sp(30)
newLabel.size_hint = (None, None)
newLabel.height = dp(30)
newLabel.width = newLabel.texture_size[0]
self.ids.boxlayout_id.add_widget(newLabel)
class TestApp(App):
def build(self):
Builder.load_string(main_kv)
return Main()
TestApp().run()
修改后的代码的问题是newLabel小部件的位置是奇数。
让我们来看看这张图片。
下面的图像是输出(尚未点击按钮)。
这是正常的,没关系。
下面的图片是我点击Button小部件三次后的输出。
正如我们所看到的,三个新的Label小部件的x位置已经过时了。
我试图分析这个问题的原因是什么,但我无法弄清楚。
我会感激任何帮助。
答案 0 :(得分:1)
您可以创建模板并添加模板,而不是每次添加时都创建新的Label并添加属性。
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
main_kv = """
<CustomLabel>:
font_size: sp(30)
size_hint: (None, None)
multiline:True
size: self.texture_size
<Main>:
scroll_view: sv
boxlayout: boxlayout_id
ScrollView:
id: sv
BoxLayout:
id: boxlayout_id
orientation: "vertical"
height: self.minimum_height
size_hint: (None, None)
Button:
text: "Add Label"
on_press: root.add_newlabel()
"""
class CustomLabel(Label):
pass
class Main(BoxLayout):
def __init__(self):
super(Main, self).__init__()
self.orientation = "vertical"
def add_newlabel(self, *args):
newLabel = CustomLabel()
newLabel.text = " A veryyyyyyyyyyyyyyyyyyyyy long text."
self.boxlayout.add_widget(newLabel)
self.scroll_view.scroll_to(newLabel)
class TestApp(App):
def build(self):
Builder.load_string(main_kv)
return Main()
if __name__ == '__main__':
TestApp().run()