使用Kivy加载表单后如何调用函数?

时间:2016-05-22 21:15:01

标签: python kivy

我正在尝试创建一个具有我展示图片的表单的应用。我在调用函数时试图更改这些图片,但是一旦表单加载并且我想让循环正常工作,我就不知道如何调用它。

.py文件:

class TerceiroScreen(Screen):
    def __init__(self, **kwargs):
        self.name = 'tres'
        super(Screen,self).__init__(**kwargs)
        i = 0
        v.append('1.jpg')
        v.append('2.jpg')
        v.append('3.jpg')


def fc1(self):
    global i, j
    for i in range(len(v)):
        if i <= len(v):
            self.ids.image2.source = v[i]
            i = i + 1
            time.sleep(1)
        else:
            i = 0
            self.ids.image2.source = v[i]

和我的.kv:

<TerceiroScreen>:
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: 'logo.jpg'


StackLayout:
    orientation: 'tb-lr'
    Image:
        source: '0.jpg'
        size_hint:(.4,.4)
        id: image2

    GridLayout:
        cols: 1
        size_hint: (.1,.1)
        Button:
            text: 'function'
            font_size: '15dp'
            on_press: root.fc1()

我希望我很清楚,谢谢。

1 个答案:

答案 0 :(得分:0)

首先:不要以这种方式使用全局变量,因为这是无稽之谈。您在i中定义__init__,然后在for中再次定义,这使得global i绝对不必要。我没有在任何地方看到j,因此,这是严重截断的片段,或者是global的其他不必要的使用。如果您想访问课程内部,请使用self.i,因为您的函数已经self,我认为该函数仅在您的问题/代码中未对齐。

第二:作为kv中的顶层,始终存在rule / class / root小部件(即使用文档编写,也不是真正稳定的名称,呵呵)。作为顶层我的意思是:

<Rule>:
    Button:
<AnotherRule>:
    ...

基本上是python类,即你的Screen,这是一个好的开始,但StackLayout已经在python class.add_widget()中使用了。并且您没有StackLayout以上的任何内容,因此我认为这是一个问题,因为这一行:on_press: root.fc1()。这句话是“查看规则,这是python类并调用它的函数fc1。没有规则,没有root.something在你的方式,因为即使它工作(没有测试它),它只会调用不存在的StackLayout.fc1()

最后:正如我所看到的,它可能只是未对齐的代码。如果没有,你也可以回答如何正确使用kivy。

class TerceiroScreen(Screen):
    def __init__(self, **kwargs):
        ...
    def fc1(self):
        ...

<TerceiroScreen>:
    canvas.before:
    StackLayout:
        GridLayout:
            Button:
                on_press: root.fc1()