kv布局按钮控件实现文本多行显示和数值传递

学习记录之kivy

分享原因是,在网上查了许多的资料,看到的都是单纯的文本拼接,而且试过之后都没办法达到要求,因此分享一个另类的实现方式。下面展示:

示例main.py 

from kivy.app import App
from kivy.properties import NumericProperty, ListProperty, StringProperty

class CounterApp(App):
    counter = NumericProperty(0)
    level_colors = ListProperty([0.2, 0.6, 1, 1])
    button_text = StringProperty()  # 新增文本属性
    level_desc = StringProperty("Newbie")  # 新增等级描述属性

    def on_start(self):
        self.update_text()  # 初始化文本

    def increment_counter(self):
        self.counter += 1
        self.update_level()
        self.update_text()

    def update_level(self):
        levels = {
            0: {"color": [0.2, 0.6, 1, 1], "desc": "Newbie"},
            5: {"color": [0.3, 0.8, 0.4, 1], "desc": "Advanced"},
            10: {"color": [0.9, 0.5, 0.1, 1], "desc": "Expert"},
            15: {"color": [0.8, 0.1, 0.1, 1], "desc": "Master"}
        }
        current_level = max(
            [key for key in levels.keys() if key <= self.counter],
            default=0
        )
        self.level_colors = levels[current_level]["color"]
        self.level_desc = levels[current_level]["desc"]

    def update_text(self):
        # 生成带换行的完整文本
        self.button_text = (
            f"Click to Increment\n"
            f"Current: {self.counter}\n"
            f"Level: {self.level_desc}"
        )

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

配套示例kv文件 

#counterapp.kv

BoxLayout:
    orientation: 'vertical'
    padding: 20
    spacing: 10

    Label:
        text: app.button_text  # 直接使用生成的文本
        font_size: '20sp'
        halign: 'center'
        valign: 'middle'
        size_hint_y: 0.3
        text_size: self.width, None
        line_height: 1.2

    Button:
        text: app.button_text  # 绑定预生成的文本
        font_size: '16sp'
        bold: True
        on_press: app.increment_counter()
        size_hint_y: 0.4
        background_color: app.level_colors
        text_size: self.width*0.9, None
        halign: 'center'
        valign: 'middle'
        line_height: 1.2

    Button:
        text: 'Reset Counter\\n(Back to Newbie)'
        font_size: '16sp'
        on_press:
            app.counter = 0
            app.update_level()
            app.update_text()  # 重置时更新文本
        size_hint_y: 0.3
        background_color: 0.9, 0.3, 0.3, 1
        text_size: self.width*0.9, None
        halign: 'center'
        valign: 'middle'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值