如何在kivy刺激按钮?

问题描述 投票:1回答:1

如何使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()
python kivy
1个回答
1
投票

导致错误是因为在Test函数中创建的interval对象与返回Test方法的build对象不同,此外还消除了在区间中创建的Test对象,因为它是局部变量。所以解决方案是通过将它传递给它的区间函数来使用相同的引用我将使用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
# ...
© www.soinside.com 2019 - 2024. All rights reserved.