我是Kivy的新用户 我想根据文件中存在的数据动态分配小部件。基本上在这种情况下,每个4的倍数的行应该是Label,而它下面的3行应该能够适合1行3列的GridLayout。
这是我不成功的尝试。
file = open("wordattack.txt","r")
ct=0
class RootWidget(FloatLayout):
def build(self):
for line in file:
f = FloatLayout(text= line, text_size= '32', size_hint= (1,0.3))
g = GridLayout(rows= 1, cols = 3, col_default_width= 10 )
if (ct%4==0):
f.add_widget(g)
else:
fl = FloatLayout(text= line, text_size= '32', size_hint= (1,0.3))
g.add_widget(f1)
print (line+ ct)
ct+=1
return f
class Random(App):
def build(self):
return RootWidget()
if __name__ == '__main__':
Random().run()
无论如何我都没有输出。任何帮助将不胜感激。
答案 0 :(得分:0)
首先,FloatLayout
!= Label
,因此没有text
属性等等......但我想这就是' s只是一个错字。然后,text_size
不是font_size
,而是您想要的变量(使文字更大/更小)。
对于你正在做的循环,我会在代码中显示它,现在是重要的部分:
build()
函数是来自App()
类的函数,因此它仅适用于class Random(App)
这是您的主要类(在其他语言中类似于int main(...)
而将不执行,因为你根本没有调用它。init()
,它是将执行的功能。return f
无法完全按照您的意愿运作,因为在Random(App)
中,return RootWidget()
会返回RootWidget
本身,而return f
将不会更改小部件的内容无论如何,您都可以使用add_widget()
和other functions Random
名称是相当不可用的名称,如果您使用random
库中的某些内容,它可能会也可能不会发生冲突,因此它更安全避免那种命名你的类我使用BoxLayout
,因为使用Float-one可能会将所有小部件放在一个位置,因为您没有指定定位,并且您不会清楚地看到输出。此外,在if-else中创建小部件比在语句之外创建小部件更有效,因为这样您只需创建所需的内容,并且内存中不会挂起随机垃圾。
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
class RootWidget(BoxLayout):
ct=0
orientation='vertical'
file = ['Q1','a','b','c','Q2','d','e','f','Q3','g','h','i',]
def __init__(self, **kwargs):
super(RootWidget, self).__init__(**kwargs)
optct=1
g = GridLayout(rows=1, cols=3, col_default_width=10)
for line in self.file:
if (self.ct%4==0):
# question here
f = Label(text=line, font_size=32, size_hint= (1,0.3))
self.add_widget(f)
else:
g.add_widget(Button(text=line))
if optct%3==0:
# add when the last(3/3) option is in the loop
self.add_widget(g)
# reset the widget
g = GridLayout(rows=1, cols=3, col_default_width=10)
optct+=1
self.ct+=1
class Random(App):
def build(self):
return RootWidget()
Random().run()