首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在奇异果中刺激按钮?

如何在奇异果中刺激按钮?
EN

Stack Overflow用户
提问于 2019-03-01 09:31:23
回答 1查看 39关注 0票数 1

如何在此代码上使用press方法?当我按下一个按钮时,列表就会填充,但当我从Clock调用它时,就不会了。我可以在控制台上看到populate打印,但是列表没有出现在视图中。我的意思很简单:如何在代码中刺激按下按钮?

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 09:46:27

错误的原因是在interval函数中创建的Test对象与返回build方法的Test对象不同,而在interval中创建的测试对象由于是局部变量而被删除。因此,解决方案是使用相同的引用,通过将其传递给interval函数,因此我将使用functools.partial()函数。

代码语言:javascript
复制
# ...
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
# ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54936712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档