Kivy:触摸标签以选中复选框

2024-10-01 09:32:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为MCQ做一个aap。这里我想要一个函数,如果有人点击了对应于复选框的标签,那么这个复选框也必须被选中。。在基维有可能吗?因为Kivy没有直接提供与checkbox的任何文本关联。在

这是kv的一部分。在

<MCQCheckBox@CheckBox>:
    color:0,0,0,1
    size_hint: 0.15, 1
    group: 'opts'

<MCQLabel@Label>:
    text_size: self.size
    valign: 'center'
    font_size: '13sp'
    color: 0,0,0,1

<MCQsGUI>:
   BoxLayout:
        orientation:'vertical'
        size_hint: 0.95, 0.7
        spacing: 2
        pos_hint: {'center_x': .5, 'center_y': .5}

    MCQBoxLayout:
        MCQCheckBox:
        MCQLabel:
            text:"option 1"
    MCQBoxLayout:
        MCQCheckBox:
        MCQLabel:
            text:"option 2"
    MCQBoxLayout:
        MCQCheckBox:
        MCQLabel:
            text:"option 3"
    MCQBoxLayout:
        MCQCheckBox:
        MCQLabel:
            text:"option 4"

Tags: 函数textsize标签复选框coloroptioncenter
2条回答

您可以只使用kv语言和动态类:

  • 要使标签的行为类似于按钮,只需使MCQLabelLabel和{}类继承。

  • 要保持组自身的行为,可以在按下关联标签时调用^{}类的_do_press ()方法(CheckBox继承自该类)。

试验电压:

<MCQCheckBox@CheckBox>:
    color: 0, 0, 0, 1
    size_hint: 0.15, 1


<MCQLabel@ButtonBehavior+Label>:
    text_size: self.size
    valign: 'center'
    font_size: '13sp'
    color: 0, 0, 0, 1


<MCQLabelCheckBox@BoxLayout>:
    text: ''
    group: ''

    MCQCheckBox:
        id: cb
        group: root.group

    MCQLabel:
        on_press: cb._do_press()
        text: root.text


<MCQsGUI>:
    canvas.before:
        Color:
            rgba: 1, 1, 1, 1
        Rectangle:
            pos: self.pos
            size: self.size

    MCQLabelCheckBox:
        text:"option 1"
        group: 'opts'

    MCQLabelCheckBox:
        text:"option 2"
        group: 'opts'

    MCQLabelCheckBox:
        text:"option 3"
        group: 'opts'

    MCQLabelCheckBox:
        text:"option 4"
        group: 'opts'

主.py:

^{pr2}$

enter image description here

我不知道是否有一种直接的/内置的方法来做到这一点。但这里是一个没有使用main.kv文件的即兴示例。在

创建CheckBoxLabel对象时,可以按以下方式手动连接CheckBox

import kivy
from kivy.uix.checkbox import CheckBox
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout

class Answer(Label):
    def __init__(self, text, associate):
        Label.__init__(self);
        self.text = text;
        self.associate = associate;
    def on_touch_down(self, touch):
        Label.on_touch_down(self, touch);
        if self.collide_point(touch.pos[0], touch.pos[1]):
            self.associate.active =  not self.associate.active;

class Page(GridLayout):
    def __init__(self):
        GridLayout.__init__(self, rows = 2, cols = 2);
        self.check = [CheckBox(), CheckBox()];
        self.ans = [Answer(text = 'Choice 1', associate = self.check[0]),\
                    Answer(text = 'Choice 2', associate = self.check[1])];
        for i in self.ans:
            self.add_widget(i);
        for i in self.check:
            self.add_widget(i);

class Example(App):
    def build(self):
        return Page()

所以每次你按下Label,它会做:self.associate.active = not self.associate.active,这是对应的CheckBox的开关。在

*这只是一种方法,你可以即兴发挥,甚至可以找到更好的方法。这样可以吗?在

相关问题 更多 >