事件绑定按钮

时间:2018-01-16 13:10:42

标签: python button tkinter

所以我正在创建一个数独游戏,并生成了一个9x9的按钮网格。有两个难度级别 - 简单和困难。选择难度级别时,会在某些按钮上随机生成数字。然后,用户单击空按钮以更改/设置一个数字(每次单击将数字增加1)。但是,用户也可以更改生成的数字。有什么方法可以阻止这个。我设法通过在我的按钮生成器中添加if语句来阻止它,但是当我添加难度级别并将代码分离为函数时,我不再能够阻止它。

这是我的按钮生成器代码:

def ButtonGenerator():
    for row_index in range(9):
        for col_index in range(9):
            if (row_index in {0, 1, 2, 6, 7, 8} and col_index in {3, 4, 5}) or \
                    (row_index in {3, 4, 5} and col_index in {0, 1, 2, 6, 7, 8}): #Colours a group of 3x3 buttons together to differentiate the board better.
                colour = 'gray85'
            else:
                colour = 'snow'
            btn = Button(frame, width = 10, height = 5, bg=colour, font=font1) #create a button inside frame
            btn.grid(row=row_index, column=col_index, sticky=N+S+E+W)
            global buttons
            buttons.append(btn)

这是我的左键单击事件功能:

def LeftClick(event):
    next_value = " 123456789 "
    try:
        current_value = next_value[next_value.index(str(int(event.widget['text']))) + 1]
    except ValueError:
        current_value = "1"

    event.widget.config(text=current_value, font=font1)

我还试图创建一个函数来停止使用预生成值的数字被用户更改,但它不起作用。任何想法为什么??

def Checker():
    for row in range(9):
        for col in range(9):            
            for btn in buttons:
                if btn.cget("text") != "":
                    btn.bind("<Button-1>", LeftClick)
                else:
                    btn.config(font=font2)
                break

1 个答案:

答案 0 :(得分:0)

它不能解决您的问题,但它显示了我将如何组织数据和代码 - 也许它可以帮助您解决问题。

首先:我将数据保存在词典中,以便我可以轻松使用data["easy"]data["hard"](与solved["easy"]相同)或使用变量data[difficalty]和{{1} }

下一步:对于空按钮,我使用solved[difficalty]代替0。我在按钮""中使用自己的字段来保留此值。接下来,我可以轻松地计算下一个值(模10)并在值为0时放入空字符串。

开始时,我使用空按钮创建电路板(b.value)并使用函数使用all_buttons重置按钮参数。这样我就可以轻松改变困境。

zip(all_buttons, data["easy"])

enter image description here