在python中循环内部动态创建变量

时间:2016-03-10 06:33:23

标签: python kivy

我试图基于外部文件为Python和Kivy动态创建一些按钮。

到目前为止,我设法通过web抓取文件,阅读它并使用它创建小部件。问题是我需要这些小部件具有唯一的var名称,我无法找到实现此目的的方法。

def build(self):
    #main layout
    menu_box = BoxLayout(orientation="horizontal")
    #web scraping
    try:
        WebLeida = request.urlopen("http://coznothingisforever.webs.com/Yoloplanner/Yoloplanner.txt").read().decode('utf8')
        WebParsed = ast.literal_eval(WebLeida)
        #for each item
        for i in WebParsed:
            #create a button
            boton = Button(font_size=16,
                            size_hint_y=None,
                            height=100,
                            text=i["dia"] + " - " + i["hora"])
            #bind the events
            boton.bind(print("testing"))
            #add the new created button to the layout
            menu_box.add_widget(boton)
    except:
        print("Something went wrong")
    #run the main layout
    return menu_box

这个问题是所有按钮都会命名为#bot; boton&#34;,所以当我需要使用像boton.bind这样的特定函数时,程序不知道要使用哪个。< / p>

这是所需的前哨,但具有唯一的var名称: enter image description here

有什么建议吗? 另外,网络抓取是实现这一目标的最佳方法吗?

2 个答案:

答案 0 :(得分:2)

你关心id是什么吗? 如果它只是唯一性那么

import uuid
id = str(uuid.uuid4())

如果你关心id可以做什么

id_template = 'button_id_{0}'
count = 1
for i in WebParsed:
   button_id = id_template.format(count)
   count += 1

答案 1 :(得分:1)

我不知道为什么没有人发布这个作为答案,即使它在python标签中。 kivy中的每个小部件都是一个对象,所以当你创建它时它就不存在,你不必直接使用变量,例如只需Button(...)。因此,它在kv文件中以这种方式设计您的应用程序非常容易:

<Root_widget>:
    SomeWidget:
        Button_1:
        ...
        Button_N:

无变量,但是如果需要,可以将id传递给窗口小部件,然后将其收集到ids字典。并且有类似ID的东西。您可以自由创建自己的字典,并以这样的方式添加您喜欢的每个按钮:

my_buttons['new_button'] = Button(font_size=16, size_hint_y=None, height=100,
                                  text=i["dia"] + " - " + i["hora"])

如果你绑定,它就像<xyz object at somewhere>.bind(),在一个例子中,它看起来像这样:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from functools import partial

class Box(BoxLayout):
    buttons={}
    def __init__(self, **kw):
        super(Box, self).__init__(**kw)
        for i in range(10):
            self.buttons[str(i)]=Button(text=str(i))
            self.add_widget(self.buttons[str(i)])
            self.buttons[str(i)].bind(on_release=partial(self.ping, str(i)))
    def ping(self, *arg):
        print 'test',str(arg)
class My(App):
    def build(self):
        return Box()
My().run()