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

如何基于__name__属性修改Kivy数独按钮的背景颜色?

数独棋盘按钮交互实现方案

核心思路:点击按钮时解析其__name__中的关键信息,遍历所有按钮匹配规则,修改目标按钮的状态。以下是具体实现步骤和Kivy代码示例:

步骤拆解

  1. 解析点击按钮信息:从点击按钮的__name__中提取区块号、行号、列号、数字。
  2. 遍历所有按钮:遍历容器内的所有按钮,逐一解析每个按钮的__name__参数。
  3. 匹配规则修改状态:判断当前按钮是否满足「同区块同数字」「同行同数字」「同列同数字」任一条件(排除点击按钮本身),修改其背景色或设置为禁用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:35:18