我试图基于外部文件为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>
有什么建议吗? 另外,网络抓取是实现这一目标的最佳方法吗?
答案 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()