2016-05-09 2 views
3

Ich schreibe ein Connect Four Spiel in Python mit Tkinter. Ich mache jetzt ein Board. Ich möchte Kreise ändern, wenn ich sie anklicke.Wie kann ich eine Form ändern, wenn ich in einer Connect Four-Karte darauf klicke?

Nur die letzte Spalte der letzten Zeile wird geändert, wo immer ich auf die Karte klicke. Wie kann ich es so einrichten, dass, wenn ich auf einen bestimmten Kreis klicke, nur dieser Kreis seine Farbe ändert?

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

Es könnte für uns (und Sie selbst) klarer sein, wenn Sie die Variablen 'row' und 'col' anstelle von i und j verwenden. Auch einige Konstanten für MAX_ROW und MAX_COL anstelle der magischen Zahlen 6 und 7. Es ist nicht sofort klar, welches was ist. –

Antwort

0

Das Problem ist die lambda Konstruktion: c ist immer die gleiche (letzte) und wird daher nicht bei der Ausführung bewertet:

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

ein Standardargument Verwenden Sie stattdessen ::

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

So c ist jetzt ein Standardargument und jetzt haben Sie verschiedene Lamdas. Siehe here für eine viel bessere Erklärung als meine.