2016-05-09 23 views
3

我使用Tkinter在Python中编写Connect Four游戏。我现在正在制作一个电路板。点击时我想让圈子改变颜色。如何在连接四块板上单击时改变形状颜色?

无论我点击主板,只有最后一行的最后一列发生更改。我怎样才能做到这一点,以便每当我点击一个特定的圆圈,只有那个圆圈改变颜色?

from tkinter import * 
import random 

def conx_create_window(): 
    mw = Tk() 
    mw.title("Connect Four Game") 
    mw.geometry("650x600") 
    mw.configure(bg="#3C3C3C", padx=50, pady=50) 
    return mw 

def main(): 
    m_window = conx_create_window() 
    return m_window 

m_window = main() 
mframe = Frame(m_window, bg="#3C3C3C", padx=50, pady=150) 
mframe.pack() 
newframe = Frame(m_window, bg="#3C3C3C", padx=50, pady=50) 
board = {} 
buttons = {} 
frames = {} 
gameBoard = Frame(m_window) 

#---------------------------------- 

def newgame_click(): 
    print("New game") 
    mframe.pack_forget() 
    boardOption() 

def boardOption(): 
    newframe.pack() 

def board7x6(): 
    gameBoard.pack() 
    newframe.pack_forget() 
    print("7x6 Board Size") 
    for row in range(6): 
     board[row] = {} 
     frames[row] = Frame(gameBoard) 
     frames[row].pack() 
     for col in range(7): 
      board[row][col] = 0 
      frame = Frame(frames[row]) 
      frame.pack(side = LEFT) 
      c = Canvas(frame, bg="#666", width=50, height=50) 
      c.pack() 
      r = c.create_rectangle((0, 0, 50, 50), fill="#3C3C3C") 
      circle = c.create_oval(3, 3, 49, 49, fill="#3D3D3D") 
      c.tag_bind(r, "<Button-1>", lambda event: print('works')) 
      c.tag_bind(circle, "<Button-1>", lambda event: c.itemconfig(circle, fill="green")) 
      print(" ", board[row][col], " ", end="") 
     print() 

def board8x7(): 
    gameBoard.pack() 
    newframe.pack_forget() 
    print("8x7 Board Size") 
    for row in range(7): # 7 rows 
     board[row] = {} 
     buttons[row] = {} 
     frames[row] = Frame(gameBoard) 
     frames[row].pack() 
     for col in range(8): # 8 columns 
      board[row][col] = 0 
      buttons[row][col] = Button(frames[row], text="", width=8, height=4, bg="#1EC811", bd=0, highlightthickness=0) 
      print("  ", board[row][col], "  ", end="") 
      buttons[row][col].pack(side=LEFT) 
     print() 

board7x6_btn = Button(newframe, text="7X6", bg="#64E545", command=board7x6, bd=0, highlightthickness=0) 
board8x7_btn = Button(newframe, text="8X7", bg="#64E545", command=board8x7, bd=0, highlightthickness=0) 

board7x6_btn.grid(row=0, column=0, padx=20, pady=10, ipadx=20, ipady=20) 
board8x7_btn.grid(row=0, column=1, padx=20, pady=10, ipadx=20, ipady=20) 

newgame_btn = Button(mframe, text="NEW GAME", bg="#64E545", command=newgame_click, bd=0, highlightthickness=0) 
load_btn = Button(mframe, text="LOAD", bg="#64E545", padx=25, bd=0, highlightthickness=0) 
ins_btn = Button(mframe, text="INSTRUCTIONS", bg="#64E545", bd=0, highlightthickness=0) 
exit_btn = Button(mframe, text="EXIT", bg="#64E545", padx=10, bd=0, highlightthickness=0)#, command = exit_click) 

newgame_btn.grid(row=0, column=0, padx=10, pady=10, ipadx=10, ipady=20) 
load_btn.grid(row=0, column=1, padx=10, pady=10, ipady=20) 
ins_btn.grid(row=1, column=0, padx=10, pady=10, ipady=20) 
exit_btn.grid(row=1, column=1, padx=10, pady=10, ipadx=20, ipady=20) 

#---------------------------------- 

m_window.mainloop() 
+2

如果您使用'row'和'col'变量名称而不是i和j,我们可能会更清楚(和您自己)。还有MAX_ROW和MAX_COL的一些常量,而不是魔术数字6和7.不知道哪个是哪个。 –

回答

0

的问题是lambda建设:C始终是相同的(最后一个),因此没有在执行评估:

c.tag_bind(circle, '<Button-1>', lambda event: c.itemconfig(circle, fill = "green")) 

使用默认参数,而不是::

c.tag_bind(circle, '<Button-1>', lambda event, c=c: c.itemconfig(circle, fill = "green")) 

所以c现在是一个默认参数,现在你有不同的lamdas。请参阅here以获得比我更好的解释。