【问题标题】:asigning ids in kivy on the python side在 python 端的 kivy 中分配 id
【发布时间】:2015-03-18 19:09:32
【问题描述】:

我正在使用 kivy。我想做的是拥有和“想法”,一个滑块和一个标签,该标签在网格布局中的一行中包含滑块的当前值

现在获得布局很好,但让标签具有与滑块当前值相同的文本值是棘手的。我正在尝试使用字符串连接来引用与它配对的滑块具有相同数字后缀的标签。

我认为我遇到的问题是,当通常必须在 kv 端完成时,我试图在 python 端分配 id。当 kv 通常期望纯文本时,要么就是我分配的 id 是字符串,要么是事实。任何帮助将不胜感激

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_'

【问题讨论】:

    标签: python python-2.7 kivy


    【解决方案1】:

    self.ids 在widget 的kv 语言规则中只收集children 的id。它不知道您通过 python 添加的小部件。

    不过,您不需要使用 id。在这种情况下,您可以保留例如id -> 小部件键的字典。

    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:])] 或任何您喜欢的方式访问它。

    我想在实践中您也可以以相同的方式修改实际的 ids 字典,尽管我主观上认为最好使用代表其更具体内容的名称来维护您自己的字典。

    【讨论】:

    • 谢谢!!我现在有新问题,我制作的每个滑块都有事件调度 on_value=slider_slid slider_slid 是一个使用你可爱的字典方法的函数,将滑块的值提供给标签以显示为文本。但是,为了正确配对,它需要知道哪个滑块发送了它(slider_1、slider_2 等),我该怎么做?我发现它很棘手,因为事件调度不能接受参数。
    • 当我意识到调度函数将发送对象作为参数移交时,我解决了上述问题,因此通过反转我制作的字典,我可以获得发送对象的字符串名称(在这个如果是滑块),我可以从字符串名称中切片并获取数字:) 非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    相关资源
    最近更新 更多