首页 > 解决方案 > 如何在主事件循环中读取和编辑按钮

问题描述

我有一个按钮网格,需要一种方法来读取特定按钮的属性并在主事件循环中编辑另一个按钮的属性。

我已经查找了许多不同的方法来编辑属性,我可以在启动时或手动写出 12 个按钮小部件,所有这些小部件都具有特定的名称,但我显然想让它更通用一点。

import kivy
from kivy.app import App
from kivy.config import Config
from kivy.uix.gridlayout import GridLayout
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.widget import Widget
from kivy.clock import Clock
kivy.require("1.11.1")

#Force window size
Config.set('graphics','width','150')
Config.set('graphics','height','200')

class ButtonField(GridLayout):
    def __init__(self, **kwargs):
        super(ButtonField, self).__init__()
        self.cols = 3
        self.rows = 4
        for count in list(range(self.cols*self.rows)):
            self.btn = ToggleButton(id=str(count))
            self.add_widget(self.btn)


class Ditto(App):
    def build(self):
        return ButtonField()

    def on_start(self):
        Clock.schedule_interval(self.update, 1)

    def update(self, *args):
        print("test")


if __name__ == "__main__":
    Ditto().run()

这是 .kv 文件。

<ToggleButton>

    id: btns
    group: 'Field'
    font_size: 40
    background_color: 1,1,1,1
    disabled_color: 1, 0.64, 0, 1
    background_normal: ''
    background_disabled_down: ''
    text: '' if btns.state == 'normal' else 'O'
    disabled: False if btns.state == 'normal' else True
    canvas:
        Color:
            rgba: .5, .5, .5, 1
        Line:
            width: 2
            rectangle: self.x, self.y, self.width, self.height

我想每 3 秒左右将其中一个按钮的背景颜色变为红色,如果按钮是红色并点击了,那么你就松了。因此读取和编辑按钮。

ps 是否有 on_first 或 on_action 之类的,所以只有在按下按钮后才能启动计划,而不是在启动时启动,那会很棒。谢谢 :)

标签: pythonbuttonkivy

解决方案


如果你想从一个.kv文件到另一个文件读取按钮属性.py,那么你需要使用ObjectProperty

在 .kv 文件中

id: btns
group: 'Field'
.
.
.

在 .py 文件中

from kivy.properties import ObjectProperty

当你写这个

self.btn = ToggleButton(id=str(count))

您需要btnkv文件中读取。为达到这个,

btns=ObjectProperty(None)
self.btns = ToggleButton(id=str(count))

请注意,变量名称btns应与id (kv file)


推荐阅读