在 python 端的 kivy 中分配 id
问题描述
我正在使用 kivy.我想做的是拥有和想法",一个滑块和一个标签,该标签在网格布局中的一行中包含滑块的当前值
im using kivy. the what im trying to do is have and 'idea',a slider and a label containing the slider's current value in a row in a grid layout
现在获得布局很好,但让标签具有与滑块当前值相同的文本值是棘手的.我正在尝试使用字符串连接来引用与它配对的滑块具有相同数字后缀的标签.
now getting the layout is fine but getting the label to have a text value the same as the slider's current value is tricky. I'm trying to use string concation to refer to the label with the same number suffix as the slider that it is paired with.
我认为我遇到的问题是,当通常必须在 kv 端完成时,我试图在 python 端分配 id.当 kv 通常期望纯文本时,要么就是我分配的 id 是字符串,要么是事实.任何帮助将不胜感激
I think the problem im having is that im trying to assign ids on the python side when they normally have to be done on the kv side. It's either that or the fact the ids i'm assigning are strings when kv would normally expect plain text. any help would be appreciated
class ScatterTextWidget(FloatLayout):
def run_me(self):
r=1
main_list=self.ids.main_list
main_list.clear_widgets()
main_list.height=0
for idea in imported_ideas:
main_list.add_widget(Label(text=idea,color=(0,0,0,1),id='idea_label_'+str(r)))
main_list.add_widget(Slider(id='Slider_'+str(r),min=0,max=10,value=5, step=1,on_value_pos=self.slider_slid(self)))
main_list.add_widget(Label(color=(0,0,0,1),id='value_label_'+str(r)))
value_label=self.ids['value_label_'+str(r)] # get this working and then apply the method into slider slid
value_label.text='xxx'
main_list.height+=35
r +=1
button_1=self.ids.button_1
button_1.text='Begin'
button_1.bind(on_press=self.begin)
def slider_slid(self,sender):
s=str(sender.id)
value_label=self.ids['value_label_'+str(s[12:])]
value_label.text=str(sender.value)
value_label=self.ids['value_label_'+str(s[12:])]KeyError:'value_label_'
value_label=self.ids['value_label_'+str(s[12:])] KeyError: 'value_label_'
解决方案
self.ids
在widget的kv语言规则中只收集children的id.它不知道您通过 python 添加的小部件.
self.ids
only collects ids from children in the kv language rule of the widget. It doesn't know about widgets you added via python.
不过,您不需要使用 id.在这种情况下,您可以保留例如id -> 小部件键的字典.
You don't need to use the id though. In this case you could keep e.g. a dictionary of id -> widget keys.
self.keys_dict = {}
for idea in imported_ideas:
new_widget = Label(color=(0,0,0,1),id='value_label_'+str(r)))
main_list.add_widget(new_widget)
self.keys_dict['value_label_' + str(r)] = new_widget
然后您可以使用 self.keys_dict['value_label_' + str(s[12:])]
或任何您喜欢的方式访问它.
Then later you can access it with self.keys_dict['value_label_' + str(s[12:])]
or whatever you like.
我想在实践中您也可以以相同的方式修改实际的 ids 字典,尽管我主观上认为最好使用代表其更具体内容的名称来维护您自己的字典.
I suppose in practice you could also modify the actual ids dictionary in the same way, though I subjectively feel it is preferable to maintain your own dictionary with a name that represents its more specific contents.
相关文章