首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >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

复制
相关文章
算法设计关于递归方程T(n)=aT(n/b)+f(n)之通用解法
算法设计关于递归方程T(n)=aT(n/b)+f(n)之通用解法 在算法设计中经常需要通过递归方程估计算法的时间复杂度T(n),本文针对形如T(n)=aT(n/b)+f(n)的递归方程进行讨论,以期望找出通用的递归方程的求解方式。 算法设计教材中给出的Master定理可以解决该类方程的绝大多数情况,根据Master定理:o-渐进上界、w-渐进下界、O-渐进确界。 设a≥1,b>1为常数,f(n)为函数,T(n)=aT(n/b)+f(n)为非负数,令x=logba: 1. f(n)=o(nx-e),e>0,那
Florian
2018/02/05
1.6K0
T3N4CI0US CTF
CISCN2019 华东南赛区]Double Secret_aoao今晚吃什么的博客-CSDN博客
故里[TRUE]
2023/04/20
4720
T3N4CI0US CTF
python 去掉\n和\t
record = data[temp].strip("\n").split(" ")
py3study
2020/01/09
4.8K0
从T+1到T+0,浅谈PetaBase的实时流式处理
随着互联网+的进一步发展,各行业对大数据技术的应用日趋成熟,企业的信息化范围正在高速扩展。
数据狗忙忙忙
2019/08/13
2.6K0
从T+1到T+0,浅谈PetaBase的实时流式处理
2023-03-04:定义一个二维数组N*M,比如5*5数组下所示: 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
(0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (2,4) (3,4) (4,4)。
福大大架构师每日一题
2023/03/04
1.1K0
2023-03-04:定义一个二维数组N*M,比如5*5数组下所示: 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
【leetcode刷题】T151-N叉树的前序遍历
https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/
木又AI帮
2019/08/28
3980
【leetcode刷题】T151-N叉树的前序遍历
【leetcode刷题】T152-N叉树的后序遍历
https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/
木又AI帮
2019/08/29
4020
【leetcode刷题】T152-N叉树的后序遍历
2023-03-04:定义一个二维数组N*M,比如5*5数组下所示:0, 1, 0, 0, 0,0, 1, 1, 1, 0,0,
[(0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (2,4) (3,4) (4,4)]。
福大大架构师每日一题
2023/06/08
3060
2023-03-04:定义一个二维数组N*M,比如5*5数组下所示:0, 1, 0, 0, 0,0, 1, 1, 1, 0,0,
0 到 n-1 的数组判重
首先我们想到的就是hash,通过hash判断一个数字是否在之前出现过只需要O(1)的时间复杂度,我们知道hashset的底层过就是hashmap的key,即hash的实现。
Tim在路上
2020/08/04
3670
T1加权像(T1 weighted image,T1WI)
T1加权成像(T1-weighted imaging,T1WI)是指这种成像方法重点突出组织纵向弛豫差别,而尽量减少组织其他特性如横向弛豫等对图像的影响。
jianghaibobo
2019/09/11
5.6K0
【leetcode刷题】T149- N叉树的层序遍历
https://leetcode-cn.com/problems/validate-binary-search-tree/
木又AI帮
2019/08/28
3880
统计0到n之间1的个数[数学,动态规划dp](经典,详解)
问题描述 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。 例如:N=2时 1,2出现了1个 “1” 。 N=12时 1,2,3,4,5,6,7,8,9,10,11,12。出现了5个“1”。 方法一 暴力求解 最直接的方法就是从1开始遍历到N,将其中每一个数中含有“1”的个数加起来,就得到了问题的解。 下面给出代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int mai
Angel_Kitty
2018/04/08
1.1K0
用N.E.A.T遗传算法玩FlappyBird
使用Python实现《Flappy Bird》类,主要包括物理引擎和死亡机制以及像素精度碰撞检测
deephub
2021/03/10
1.3K0
用N.E.A.T遗传算法玩FlappyBird
【leetcode刷题】T199-第N个数字
https://leetcode-cn.com/problems/nth-digit
木又AI帮
2019/11/24
6390
SDH/E1/T1/E3/T3/STM/
同步数字系列   Synchronous Digital Hierarchy  SDH是为了使正确适配的净负荷在物理传输网(主要是光缆)上传送而形成的一系列标准化的数字传送结构。
py3study
2020/01/10
2K0
证明:对于一棵二叉树,若度为2的结点有n2个,叶子结点有n0个,则n0=n2+1
image.png
风骨散人Chiam
2021/09/06
6260
2023-05-05:给定一个无向、连通的树 树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges , edge
输入: n = 6, edges = [0,1,0,2,2,3,2,4,2,5]。
福大大架构师每日一题
2023/05/05
2560
2023-05-05:给定一个无向、连通的树 树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges , edge
世纪互联OneDrive容量改为5T
首先按照文档中的内容,下载sharepoint online 的模块 https://www.microsoft.com/zh-cn/download/details.aspx?id=35588 安装
Erwin
2019/12/31
8.2K1
【leetcode刷题】T209-求解方程
https://leetcode-cn.com/problems/solve-the-equation/
木又AI帮
2019/12/12
6400
Python编程 | T-N波作用通量水平分量
受“甲方”委托,我写了一个计算T-N波作用通量水平分量的Python脚本。虽然之前我从来没有听说过“T-N波作用通量”这个东西,但是好在公式里每个物理量都还算眼熟,仔细捋顺了计算细节,最终成果还是受到了“甲方”的肯定。
气象学家
2021/05/20
5.9K2
Python编程 | T-N波作用通量水平分量

相似问题

求解递推关系T(n) = n*T(n - 1) + n!(n > 0,T(0) = 2)

173

T(n) = T(n - sqrt(n)) + T(sqrt(n)) +1

10

如何用递归树求解T(n) = T(n-1) + n^2

11

如何求解递归T(n) = T(n/2) + T(n/4),T(1) = 0,T(2) =1是T(n) =Θ(n lgφ),其中φ是黄金比?

12

如何求解递归T(n)=T(n-1) +.T(1) +1?

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档