首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Kivy,重用切换按钮布局,但为按钮分配不同的功能

Kivy,重用切换按钮布局,但为按钮分配不同的功能
EN

Stack Overflow用户
提问于 2021-01-03 14:58:46
回答 2查看 159关注 0票数 0

我已经创建了一个自定义的切换按钮布局,我想多次重复使用它。我想重复使用它,因为它包含大量的格式化。我使用生成的uuid来分配组,这样多个实例就不会相互干扰。

这是我的test.kv:

代码语言:javascript
运行
AI代码解释
复制
#:kivy 2.0.0
#:import uuid uuid

<ExampleToggle@BoxLayout>:
    uuid: uuid.uuid4()
    orientation: 'horizontal'

    ToggleButton:
        id: run
        text: 'RUN'
        group: root.uuid
        on_release: root.on_run()

    ToggleButton:
        id: stop
        text: 'STOP'
        group: root.uuid
        on_release: root.on_stop()

<TestDisplay>:
    BoxLayout:
        orientation: 'vertical'
        
        ExampleToggle:
            on_run: print('A') 
            on_stop: print('B') 

        ExampleToggle:
            on_run: print('C') 
            on_stop: print('D') 

这是我的test.py:

代码语言:javascript
运行
AI代码解释
复制
import kivy
kivy.require('2.0.0')

from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.widget import Widget


class ExampleToggle():
    on_run = ObjectProperty(None)
    on_stop = ObjectProperty(None)

    def on_run(self, *args):
        # Dummy function
        pass

    def on_stop(self, *args):
        # Dummy function
        pass


class TestDisplay(Widget):
    pass


class TestApp(App):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def build(self):
        return TestDisplay()


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

我希望能够创建ExampleToggle小部件的多个副本,并为按钮分配不同的功能。我可以将函数分配给各个按钮的on_release事件,但是如果我这样做了,那么对于这个小部件的每个实例来说,它都是相同的事件。我希望能够在每次重用小部件时分配不同的函数。

我觉得我要么错过了一些非常简单的东西,要么我走错了路。我尝试了多种不同的方法,花了大量的时间阅读和研究……任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-13 01:47:57

经过长时间的休息后,我又回到了这个问题上,并得出了答案。这是我为其他好奇的人或将来的我自己提供的工作解决方案。我必须在python中构建切换布局,然后在.kv文件中使用它。关键是使用'self.dispatch()‘方法。这是我在阅读按钮的kivy源代码时发现的。

test.kv:

代码语言:javascript
运行
AI代码解释
复制
#:kivy 2.0.0
#:import uuid uuid
#:import ExampleToggle test

<TestDisplay>:
    BoxLayout:
        orientation: 'vertical'
        
        ExampleToggle:
            on_run: print('A') 
            on_stop: print('B') 

        ExampleToggle:
            on_run: print('C') 
            on_stop: print('D') 

test.py:

代码语言:javascript
运行
AI代码解释
复制
from uuid import uuid4

import kivy
kivy.require('2.0.0')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.boxlayout import BoxLayout


class ExampleToggle(BoxLayout):
    def __init__(self, **kwargs):
        self.register_event_type('on_run')
        self.register_event_type('on_stop')

        super(ExampleToggle, self).__init__(**kwargs)

        self.groupid = uuid4()
        self.orientation = 'horizontal'
        self.size_hint = (None, .1)
        self.width: self.height * 5
        self.state = None

        rbtn = ToggleButton(text='RUN',
                            group=self.groupid,
                            allow_no_selection=False)
        sbtn = ToggleButton(text='STOP',
                            group=self.groupid,
                            allow_no_selection=False)

        self.add_widget(rbtn)
        self.add_widget(sbtn)

        rbtn.bind(on_release=self.run)
        sbtn.bind(on_release=self.stop)

    def run(self, *args):
        if self.state != 'RUN':
            self.dispatch('on_run')
            self.state = 'RUN'

    def stop(self, *args):
        if self.state != 'STOP':
            self.dispatch('on_stop')
            self.state = 'STOP'

    def on_run(self):
        pass

    def on_stop(self):
        pass


class TestDisplay(Widget):
    pass


class TestApp(App):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def build(self):
        return TestDisplay()


if __name__ == '__main__':
    TestApp().run()
票数 0
EN

Stack Overflow用户

发布于 2021-01-03 15:07:01

您只需要提供一种方法,以便在运行时设置所调用的函数。

例如,您可以在ExampleToggle Python代码中使用f1 = ObjectProperty()f2 = ObjectProperty(),然后在kv代码中使用on_release: root.f1()等。要设置函数,可以在kv中使用f1: do_something_a,或者在python中使用your_exampletoggle.f1 = do_something_a,其中do_something_a是一个函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65551226

复制
相关文章

相似问题

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