使用KIVY

时间:2016-04-30 03:43:30

标签: python python-3.x kivy

我是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()

无论如何我都没有输出。任何帮助将不胜感激。

1 个答案:

答案 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()