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
相关产品推荐
相关产品推荐

