Code: Alles auswählen
from itertools import cycle
from functools import partial
import tkinter as tk
 
FENSTER_TITLE = "TickTackToe Spiel"
 
class TickTackToe(object):
    LEER = "leer.png"
    KREIS = "kreis.png"
    KREUZ = "kreuz.png"
    REIHEN = [
        [(0,0), (0,1), (0,2)],
        [(1,0), (1,1), (1,2)],
        [(2,0), (2,1), (2,2)],
        [(0,0), (1,0), (2,0)],
        [(0,1), (1,1), (2,1)],
        [(0,2), (1,2), (2,2)],
        [(0,0), (1,1), (2,2)],
        [(0,2), (1,1), (2,0)],
    ]
 
    def __init__(self, fenster):
        self.fenster = fenster
        self.images = {
            None: tk.PhotoImage(file=self.LEER),
            'Kreis': tk.PhotoImage(file=self.KREIS),
            'Kreuz': tk.PhotoImage(file=self.KREUZ),
        }
        self.knoepfe = dict()
        self.runden = 0
        self.spieler = cycle(['Kreis', 'Kreuz'])
        self.feld_bauen()
       
    def feld_bauen(self):
        self.melde_text_var = tk.StringVar(self.fenster, "Neues Spiel")
        meldung = tk.Label( self.fenster, textvariable=self.melde_text_var,
            font=('Helvetica', 12, 'bold'))
        meldung.pack(pady=4)
       
        knopf_rahmen = tk.Frame(self.fenster)
        knopf_rahmen.pack()
 
        for reihe in range(3):
            for zeile in range(3):
                knopf_widget = tk.Button(knopf_rahmen, image=self.images[None],
                    highlightthickness=0, bg='white', command=partial(self.knopf_druck, (reihe, zeile)))
                knopf_widget.grid(row=reihe, column=zeile)
                knopf_widget.status = None
                self.knoepfe[reihe, zeile] = knopf_widget
 
        self.reset_button = tk.Button(self.fenster, text="Wiederholung?",
            bg="yellow", command=self.reset_command)
    def set_status(self, key, status):
        self.knoepfe[key].status = status
        self.knoepfe[key]['image'] = self.images[status]
       
    def reset_command(self):
        for key in self.knoepfe:
            self.set_status(key, None)
        self.runden = 0
        self.melde_text_var.set("Neues Spiel")
        self.reset_button.pack_forget()
       
    def knopf_druck(self, knopf):
        print("Knopf gedrückt:", knopf)
        status = next(self.spieler)
        self.set_status(knopf, status)
        if any(all(self.knoepfe[r].status == status for r in row)
                for row in self.REIHEN):
            self.melde_text_var.set("Gewinner: {}".format(status))
            self.reset_button.pack(pady=4)
        else:
            self.runden += 1
            if self.runden==9:
                self.melde_text_var.set("Unentschieden")
                self.reset_button.pack(pady=4)
       
def main():
    fenster = tk.Tk()
    fenster.title(FENSTER_TITLE)
    app = TickTackToe(fenster)
    fenster.mainloop()
 
if __name__ == '__main__':
    main()
