【发布时间】:2019-11-24 18:48:51
【问题描述】:
目标
我有一个带有属性c_description 的小部件类。我需要能够创建标签(或其他类型的小部件)并将其添加到这个继承 c_description 作为文本的小部件。并且对c_description 的更改会传播到标签的文本。我需要能够使用函数运行此标签的创建/添加。
我基本上需要完全按照this other question 的要求去做。
我做了什么,遇到了什么问题
我格式化了这个标签类StretchingLabelstretch 以适应它的内容。我有一个script in kivy,它显示了我希望它如何工作。
最终结果应该是这样的。
这是other script,在将其text 属性绑定到c_description 失败后,我在其中动态创建并添加了一个新小部件。
如果我运行它,我会得到如下所示的结果。
标签的文本是“”而不是c_description 的内容,所以这是一个问题。
但是,如果我删除属性绑定语句并将c_label = StretchingLabel() 更改为c_label = StretchingLabel(pos=self.pos, width=self.width, text=self.c_description),我们至少应该能够看到成功的属性绑定是什么样的。
当我这样做时,结果看起来像这样。
这不是我想要的。我希望它看起来像第一张照片。
我的代码
from kivy.app import App
from kivy.lang import Builder
from kivy.clock import Clock
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
from kivy.uix.textinput import TextInput
Builder.load_string('''
<StretchingLabel>:
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
group: 'test'
canvas.before:
Color:
rgba: .7, .7, .7, 1
Rectangle:
pos: self.pos
size: self.size
<MyLabelFrame>:
id: xLabel
<ContainerBox>:
orientation: 'horizontal'
Button:
text: 'h1'
group: 'test'
BoxLayout:
orientation: 'vertical'
size: root.size
pos: root.pos
Label:
text: 'Description'
size_hint_y: None
height: 30
bold: True
MyLabelFrame:
Label:
''')
class StretchingLabel(Label):
def __init__(self, **kwargs):
super(StretchingLabel, self).__init__(**kwargs)
#This is for debugging
Clock.schedule_once(lambda dt: print("StretchingLabel.init(): ", self.text), timeout=0.01)
def on_double_click(self, instance, p_ignoreme):
#This is also for debugging
print("StretchingLabel.on_double_click():", self.text)
class MyLabelFrame(Widget):
c_description = StringProperty(
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. \n\nProin vitae turpis ornare urna elementum pharetra non et tortor. Curabitur semper mattis viverra. \nPellentesque et lobortis purus, eu ultricies est. Nulla varius ac dolor quis mattis. Pellentesque vel accumsan tellus. Donec a nunc urna. Nulla convallis dignissim leo, tempor sagittis orci sollicitudin aliquet. Duis efficitur ex vel auctor ultricies. Etiam feugiat hendrerit mauris suscipit gravida. Quisque lobortis vitae ligula eget tristique. Nullam a nulla id enim finibus elementum eu sit amet elit.')
def __init__(self, **kwargs):
super(MyLabelFrame, self).__init__(**kwargs)
Clock.schedule_once(lambda dt: self.makeLabel(), timeout=0.01)
def makeLabel(self):
c_label = StretchingLabel()
#HERE! This vvv does not seem to work for some reason.
self.bind(pos=c_label.setter('pos'), width=c_label.setter('width'), c_description=c_label.setter('text'))
#This vvv didn't work either.
#c_label.bind(pos=self.setter('pos'), width=self.setter('width'), text=self.setter('c_description'))
self.add_widget(c_label)
class ContainerBox(BoxLayout):
def __init__(self, **kwargs):
super(ContainerBox, self).__init__(**kwargs)
class Nested2App(App):
def build(self):
return ContainerBox()
if __name__ == '__main__':
Nested2App().run()
我的问题
- 为什么
self.bind(c_description=c_label.setter('text'))不起作用?正在创建标签,但没有从c_description获取文本。我做错了什么? - 为什么创建的标签格式错误?我在 kv 代码中传递了与
makeLabel()中相同的属性。我需要能够使用makeLabel()函数正确执行此操作。
注意
我看到another question here 遇到了与我完全相同的问题(没有格式问题),但由于某种原因,答案对我不起作用。
【问题讨论】:
标签: python python-3.x properties kivy kivy-language