如何基于__name__属性修改Kivy数独按钮的背景颜色?
数独棋盘按钮交互实现方案
核心思路:点击按钮时解析其__name__中的关键信息,遍历所有按钮匹配规则,修改目标按钮的状态。以下是具体实现步骤和Kivy代码示例:
步骤拆解
- 解析点击按钮信息:从点击按钮的
__name__中提取区块号、行号、列号、数字。 - 遍历所有按钮:遍历容器内的所有按钮,逐一解析每个按钮的
__name__参数。 - 匹配规则修改状态:判断当前按钮是否满足「同区块同数字」「同行同数字」「同列同数字」任一条件(排除点击按钮本身),修改其背景色或设置为禁用。
Kivy代码示例
1. 基础布局与按钮创建
将所有数独按钮放入GridLayout容器,创建时按格式设置__name__:
from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.uix.button import Button class SudokuGrid(GridLayout): def __init__(self, **kwargs): super().__init__(**kwargs) self.cols = 9 # 数独9列布局 self.buttons = [] # 存储所有按钮,方便遍历 # 生成数独按钮(可根据实际逻辑调整生成规则) for block in range(1, 10): for row in range(1, 10): for col in range(1, 10): # 示例单元格号计算,可按需修改 cell = (block-1)*9 + (row-1)*3 + (col-1)%3 + 1 for num in range(1, 10): btn = Button(text=str(num)) # 按格式设置__name__ btn.__name__ = f"[{block}, {row}, {col}, {cell}, {num}]" btn.bind(on_press=self.on_button_click) self.add_widget(btn) self.buttons.append(btn) def on_button_click(self, instance): # 解析点击按钮的__name__ name_parts = instance.__name__.strip('[]').split(', ') click_block = int(name_parts[0]) click_row = int(name_parts[1]) click_col = int(name_parts[2]) click_num = int(name_parts[4]) # 重置所有按钮状态(可选,避免之前的点击残留影响) for btn in self.buttons: btn.background_color = (1, 1, 1, 1) # 恢复默认白色背景 btn.disabled = False # 遍历所有按钮匹配规则 for btn in self.buttons: if btn == instance: continue # 跳过点击的按钮本身 # 解析当前按钮的__name__ btn_parts = btn.__name__.strip('[]').split(', ') btn_block = int(btn_parts[0]) btn_row = int(btn_parts[1]) btn_col = int(btn_parts[2]) btn_num = int(btn_parts[4]) # 匹配规则:同区块同数字/同行同数字/同列同数字 if (btn_block == click_block and btn_num == click_num) or \ (btn_row == click_row and btn_num == click_num) or \ (btn_col == click_col and btn_num == click_num): btn.background_color = (0.7, 0.7, 0.7, 1) # 置灰背景 # btn.disabled = True # 禁用按钮,按需选择 class SudokuApp(App): def build(self): return SudokuGrid() if __name__ == "__main__": SudokuApp().run()
2. 关键代码说明
__name__解析:因为__name__是字符串格式的列表,需先去除首尾括号,再分割转成整数用于比较。- 规则匹配:三个条件用逻辑或连接,满足任一条件即修改按钮状态。
- 状态重置:每次点击前恢复所有按钮的默认状态,可根据需求决定是否保留。
- 状态修改:可选择修改背景色、禁用按钮,或两者结合,完全按需调整。
注意事项
- 确保
__name__格式完全统一(比如分隔符是逗号加空格),避免解析出错。 - 数独按钮总数为729个,遍历操作不会有性能问题。
- 可额外给点击的按钮设置特殊样式(比如蓝色背景),方便用户区分选中状态。
内容的提问来源于stack exchange,提问作者zpick
相关产品推荐
相关产品推荐

