按钮网格:单击时更改颜色

时间:2014-10-13 22:58:15

标签: python tkinter

所以我有一个像我这样创建的按钮网格(在Python 3.4上使用Tkinter):

from tkinter import *

vText = [ "A","B","C","D","E","F","G","H","I","J" ]
boat  = [ "A1","A2","A3" ]
shots = []

def press( pos, b, pos2 ):
    if pos in shots:
        print( "You've chosen this already!" )
    else:
        shots.append( pos )
        if pos in boat:
            print( "Hit!" )
            b[pos2].configure( bg = "red", fg = "white" )
        else:
            print( "Miss." )
            b[pos2].configure( bg = "blue", fg = "white" )

root   = Tk()
button = []
row    = []
column = []
for a in range( 1, 102 ):
    button.append( a )
    row.append(    a )
    column.append( a )

for i in range( 0, 10 ):
    for j in range( 1, 11 ):
        p2 = i * 10 + j
        button[p2] = Button( root, text    = vText[i] + str(j),                   \
                                   command = lambda i=i, j=j, position=vText[i] + str(j): press( position, button, p2 ), \
                                   padx    = 25,                                  \
                                   pady    = 25,                                  \
                                   bg      = "#66CCCC"                            \
                                   )
        button[p2].grid( row = i, column = j )

root.wm_title( "Enemy grid" )
root.mainloop()

正如您所看到的,我已经尝试过(在 press() 定义中)来完成这项工作,但pos2只能参考最后一个因为它在i循环中使用jfor

这是BattleShip代码的一部分,因此我已经添加了一些零碎的部分。但问题是一样的。我希望能够单击一个,并在单击时更改颜色。创建所有100个按钮都需要它。另外,我需要它变成红色,如果它是一个命中,或蓝色,如果它是一个未命中。

提前致谢。

1 个答案:

答案 0 :(得分:0)

为了使用Tkinter中的按钮(或任何GUI框架,尽管术语和技术非常合适),您需要将一个函数绑定到按钮。

例如:

from functools import partial

def my_func_name(sequence, index):
    widget = sequence[index]
    widget.configure(bg='white') #  for example

for i in range(0,10):
    for j in range(1,11):
        p2 = i * 10 + j
        par = partial(my_func_name, button, p2)
        button[p2] = Button(root, text = vText[i] + str(j), command=par, padx=25, pady=25, bg = "#66CCCC")
        button[p2].grid(row=i, column=j)

Effbot写了一本关于Tkinter(免费)的好书,还有Tkdocs,这是一个很棒的教程,比SO问题更详细地介绍了基础知识。

这个答案已被编辑,以反映我在第一次回答问题时所做的愚蠢的傻瓜。