所以我有一个像我这样创建的按钮网格(在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
循环中使用j
和for
。
这是BattleShip代码的一部分,因此我已经添加了一些零碎的部分。但问题是一样的。我希望能够单击一个,并在单击时更改颜色。创建所有100个按钮都需要它。另外,我需要它变成红色,如果它是一个命中,或蓝色,如果它是一个未命中。
提前致谢。
答案 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问题更详细地介绍了基础知识。
这个答案已被编辑,以反映我在第一次回答问题时所做的愚蠢的傻瓜。