You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KivyMD DataTable实现on_row_press时修改行背景色

KivyMD DataTable点击行修改背景色实现方案

需求说明

需要实现两种点击行的背景色修改逻辑:

  • 点击行时切换该行背景色(多次点击可在高亮/默认状态间切换)
  • 仅高亮最后一次点击的行(之前点击的行自动恢复默认样式)

实现代码

方案1:切换点击行的背景色

from kivy.metrics import dp
from kivy.uix.anchorlayout import AnchorLayout
from kivymd.app import MDApp
from kivymd.uix.datatables import MDDataTable

class Example(MDApp):
    def build(self):
        layout = AnchorLayout()
        # 记录每行的背景色状态
        self.row_colors = {}
        self.data_tables = MDDataTable(
            use_pagination=True,
            check=False,
            column_data=[
                ("No.", dp(30)),
                ("Status", dp(30)),
                ("Signal Name", dp(60)),
                ("Severity", dp(30)),
                ("Stage", dp(30)),
                ("Schedule", dp(30)),
                ("Team Lead", dp(30))
            ],
            row_data=[
                ("1", ("alert", [255 / 256, 165 / 256, 0, 1], "No Signal"),
                 "Astrid: NE shared managed", "Medium", "Triaged", "0:33",
                 "Chase Nguyen"),
                ("2", ("alert-circle", [1, 0, 0, 1], "Offline"),
                 "Cosmo: prod shared ares", "Huge", "Triaged", "0:39",
                 "Brie Furman"),
                ("3", (
                    "checkbox-marked-circle",
                    [39 / 256, 174 / 256, 96 / 256, 1],
                    "Online"), "Phoenix: prod shared lyra-lists", "Minor",
                 "Not Triaged", "3:12", "Jeremy lake"),
            ],
        )
        self.data_tables.bind(on_row_press=self.on_row_press_toggle)
        layout.add_widget(self.data_tables)
        return layout

    def on_row_press_toggle(self, instance_table, instance_row):
        # 默认背景色(KivyMD DataTable行默认透明背景)
        default_color = [0, 0, 0, 0]
        # 自定义高亮色
        highlight_color = [0.2, 0.6, 1, 0.3]
        
        # 切换该行背景色状态
        if instance_row in self.row_colors:
            instance_row.background_color = default_color
            del self.row_colors[instance_row]
        else:
            instance_row.background_color = highlight_color
            self.row_colors[instance_row] = highlight_color

Example().run()

方案2:仅高亮最后一次点击的行

from kivy.metrics import dp
from kivy.uix.anchorlayout import AnchorLayout
from kivymd.app import MDApp
from kivymd.uix.datatables import MDDataTable

class Example(MDApp):
    def build(self):
        layout = AnchorLayout()
        # 记录最后一次点击的行实例
        self.last_clicked_row = None
        self.data_tables = MDDataTable(
            use_pagination=True,
            check=False,
            column_data=[
                ("No.", dp(30)),
                ("Status", dp(30)),
                ("Signal Name", dp(60)),
                ("Severity", dp(30)),
                ("Stage", dp(30)),
                ("Schedule", dp(30)),
                ("Team Lead", dp(30))
            ],
            row_data=[
                ("1", ("alert", [255 / 256, 165 / 256, 0, 1], "No Signal"),
                 "Astrid: NE shared managed", "Medium", "Triaged", "0:33",
                 "Chase Nguyen"),
                ("2", ("alert-circle", [1, 0, 0, 1], "Offline"),
                 "Cosmo: prod shared ares", "Huge", "Triaged", "0:39",
                 "Brie Furman"),
                ("3", (
                    "checkbox-marked-circle",
                    [39 / 256, 174 / 256, 96 / 256, 1],
                    "Online"), "Phoenix: prod shared lyra-lists", "Minor",
                 "Not Triaged", "3:12", "Jeremy lake"),
            ],
        )
        self.data_tables.bind(on_row_press=self.on_row_press_highlight_last)
        layout.add_widget(self.data_tables)
        return layout

    def on_row_press_highlight_last(self, instance_table, instance_row):
        default_color = [0, 0, 0, 0]
        highlight_color = [0.2, 0.6, 1, 0.3]
        
        # 恢复上一次点击行的默认背景
        if self.last_clicked_row:
            self.last_clicked_row.background_color = default_color
        
        # 设置当前行高亮
        instance_row.background_color = highlight_color
        self.last_clicked_row = instance_row

Example().run()

关键说明

  • 点击事件返回的instance_row是行实例,直接修改其background_color属性即可改变背景色
  • default_color使用KivyMD DataTable行的默认透明背景色[0,0,0,0],可根据需求替换为其他RGB/A颜色值
  • 方案1通过字典记录已点击行的状态,实现点击切换效果;方案2通过跟踪最后点击的行,实现仅高亮最新点击行的效果

内容的提问来源于stack exchange,提问作者ahmed omran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:18:23