如何刺激纽扣?

时间:2019-03-01 01:31:23

标签: python kivy

如何使此代码上的press方法有效?当我按下按钮时,将填充列表,但是当我从Clock进行调用时,列表将不显示。我可以在控制台上看到populate的打印内容,但该列表未出现在视图中。我的意思很简单:如何激发按下代码中的按钮?

from kivy.config import Config
Config.set('graphics', 'multisamples', '0')
from random import sample
from string import ascii_lowercase
import pyrebase
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock

kv = """

<Row@BoxLayout>:

    canvas.before:
        Color:
            rgba: 0.5, 0.5, 0.5, 1
        Rectangle:
            size: self.size
            pos: self.pos
    value: ''
    Label:
        text: root.value

<Test>:
    canvas:
        Color:
            rgba: 0.3, 0.3, 0.3, 1
        Rectangle:
            size: self.size
            pos: self.pos
    rv: rv
    orientation: 'vertical'
    GridLayout:
        cols: 3
        rows: 2
        size_hint_y: None
        height: dp(108)
        padding: dp(8)
        spacing: dp(16)
        Button:
            id: populate_btn
            text: 'Populate list'
            on_press: root.populate()



    RecycleView:
        id: rv
        scroll_type: ['bars', 'content']
        scroll_wheel_distance: dp(114)
        bar_width: dp(10)
        viewclass: 'Row'
        RecycleBoxLayout:
            default_size: None, dp(56)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
            orientation: 'vertical'
            spacing: dp(2)
"""

Builder.load_string(kv)


class Test(BoxLayout):


    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def populate(self):
        print("populate")

        self.rv.data = [{'value': ''.join(sample(ascii_lowercase, 6))}
                        for x in range(50)]

    def press(self):
        self.ids.populate_btn.dispatch('on_press')


def interval(dt):
    x = Test()
    x.press()

Clock.schedule_interval(interval, 3)


class TestApp(App):
    def build(self):
        return Test()

if __name__ == '__main__':
    TestApp().run()

1 个答案:

答案 0 :(得分:1)

由于在Test函数中创建的interval对象与返回Test方法的build对象不同,除了在间隔中创建的Test对象外,还导致了错误被消除,因为它是局部变量。因此解决方案是通过将相同的引用传递给interval函数来使用该引用,为此我将使用functools.partial()函数。

# ...
from functools import partial

# ...

def interval(x, dt):
    x.press()

class TestApp(App):
    def build(self):
        t = Test()
        Clock.schedule_interval(partial(interval, t), 3)
        return t
# ...