Button aktiviert sich automatisch

Fragen zu Tkinter.
jado
User
Beiträge: 13
Registriert: Montag 5. Februar 2018, 15:29

Hallo ich bin gerade am anfang python zu lernen und versuche ein TickTackToe spiel zu machen aber die Buttons lösen irgendwie automatisch aus.ich hoffe ihr könnt mir helfen

Code: Alles auswählen

from tkinter import*
fenster=Tk()
knoepfe:["knopf1","knopf2","knopf3","knopf4","knopf5","knopf6","knopf7","knopf8","knopf9",0,1]  
img=PhotoImage(file="leer.png")
img_kreis=PhotoImage(file="kreis.png")
img_kreuz=PhotoImage(file="kreuz.png")
def a():
    print("bsjufbh")
meldung= Label( fenster , text="Gewinner: ")
knopf1=Button(fenster,image=img,command=a())
knopf2=Button(fenster,image=img,command=a())
knopf3=Button(fenster,image=img,command=a())
knopf4=Button(fenster,image=img,command=a())
knopf5=Button(fenster,image=img,command=a())
knopf6=Button(fenster,image=img,command=a())
knopf7=Button(fenster,image=img,command=a())
knopf8=Button(fenster,image=img,command=a())
knopf9=Button(fenster,image=img,command=a())

knopf1.place(x=50,y=70)
knopf2.place(x=90,y=70)
knopf3.place(x=130,y=70)
knopf4.place(x=50,y=110)
knopf5.place(x=90,y=110)
knopf6.place(x=130,y=110)
knopf7.place(x=50,y=150)
knopf8.place(x=90,y=150)
knopf9.place(x=130,y=150)
def auswertung():
            
    if knoepfe[10]==1:
        knoepfe[10]=0
    else :
        knoepfe[10]=1
                    
                
    if (knoepfe[0]==knoepfe[1] ==knoepfe[2]) or (knoepfe[3]==knoepfe[4]==knoepfe[5])or(knoepfe[6] == knoepfe[7] == knoepfe[8]) or (knoepfe[0] == knoepfe[3] == knoepfe[6]) or (knoepfe[1] == knoepfe[4] == knoepfe[7]) or (knoepfe[2] == knoepfe[5] == knoepfe[8]) or (knoepfe[0] == knoepfe[4] == knoepfe[8]) or (knoepfe[2] == knoepfe[4] ==knoepfe[6] )==1:
            meldung.config(text="Gewinner: " ,bg="yellow")
    elif( knoepfe[0] == knoepfe[1] == knoepfe[2] )or (knoepfe[3] == knoepfe[4] == knoepfe[5]) or (knoepfe[6] == knoepfe[7] == knoepfe[8]) or( knoepfe[0] == knoepfe[3] == knoepfe[6]) or (knoepfe[1] == knoepfe[4] == knoepfe[7]) or (knoepfe[2] == knoepfe[5] == knoepfe[8]) or (knoepfe[0] == knoepfe[4] == knoepfe[8]) or (knoepfe[2] == knoepfe[4] == knoepfe[6])==2:
        meldung.config(text="Gewinner: " ,bg="yellow")
    knoepfe[9]+=1
            #unentschieden
    if knoepfe[9]==9:
        print ("unentschieden")

def a():
    print("bsjufbh")
def knopfdruecken1(knopfnummer):
    print(knopfnummer)
    if knoepfe[10]==1:
        knopf1.config(image=img_kreis,command=a)
        knoepfe[0]=1
    else:
        knopf1.config(image=img_kreuz)
        knoepfe[0]=2
    auswertung()
def knopfdruecken2(knopfnummer):
    print(knopfnummer)
    if knoepfe[10]==1:
        knopf2.config(image=img_kreis,command=a)
        knoepfe[knopfnummer]=1
    else:
        knopf2.config(image=img_kreuz)
        knoepfe[knopfnummer]=2
    auswertung()
def knopfdruecken3(knopfnummer):
    print(knopfnummer)
    if knoepfe[10]==1:
        knopf3.config(image=img_kreis,command=a)
        knoepfe[knopfnummer]=1
    else:
        knopf3.config(image=img_kreuz)
        knoepfe[knopfnummer]=2
    auswertung()
def knopfdruecken4(knopfnummer):
    print(knopfnummer)
    if knoepfe[10]==1:
        knopf4.config(image=img_kreis,command=a)
        knoepfe[knopfnummer]=1
    else:
        knopf4.config(image=img_kreuz)
        knoepfe[knopfnummer]=2
    auswertung()
def knopfdruecken5(knopfnummer):
    print(knopfnummer)
    if knoepfe[10]==1:
        knopf5.config(image=img_kreis,command=a)
        knoepfe[knopfnummer]=1
    else:
        knopf5.config(image=img_kreuz)
        knoepfe[knopfnummer]=2
    auswertung()
def knopfdruecken6(knopfnummer):
    print(knopfnummer)
    if knoepfe[10]==1:
        knopf6.config(image=img_kreis,command=a)
        knoepfe[knopfnummer]=1
    else:
        knopf6.config(image=img_kreuz)
        knoepfe[knopfnummer]=2
    auswertung()
def knopfdruecken7(knopfnummer):
    print(knopfnummer)
    if knoepfe[10]==1:
        knopf7.config(image=img_kreis,command=a)
        knoepfe[knopfnummer]=1
    else:
        knopf7.config(image=img_kreuz)
        knoepfe[knopfnummer]=2
    auswertung()
def knopfdruecken8(knopfnummer):
    print(knopfnummer)
    if knoepfe[10]==1:
        knopf8.config(image=img_kreis,command=a)
        knoepfe[knopfnummer]=1
    else:
        knopf8.config(image=img_kreuz)
        knoepfe[knopfnummer]=2
    auswertung()
def knopfdruecken9(knopfnummer):
    print(knopfnummer)
    if knoepfe[10]==1:
        knopf9.config(image=img_kreis,command=a)
        knoepfe[knopfnummer]=1
    else:
        knopf9.config(image=img_kreuz)
        knoepfe[knopfnummer]=2
    auswertung()
    
knopf1.config(command=knopfdruecken1(0))
knopf2.config(command=knopfdruecken2(1))
knopf3.config(command=knopfdruecken3(2))
knopf4.config(command=knopfdruecken4(3))
knopf5.config(command=knopfdruecken5(4))
knopf6.config(command=knopfdruecken6(5))
knopf7.config(command=knopfdruecken7(6))
knopf8.config(command=knopfdruecken8(7))
knopf9.config(command=knopfdruecken9(8))
        
      

    

jado
User
Beiträge: 13
Registriert: Montag 5. Februar 2018, 15:29

Ich habe es inzwischen überarbeitet aber die if's die den gewinner herrausfinden funktionieren nicht wie sie sollen (zeile 45)

Code: Alles auswählen

from tkinter import*
fenster=Tk()
        
            
            #dateien erstellen
knoepfe=["knopf1","knopf2","knopf3","knopf4","knopf5","knopf6","knopf7","knopf8","knopf9",0,1]  
img=PhotoImage(file="leer.png")
img_kreis=PhotoImage(file="kreis.png")
img_kreuz=PhotoImage(file="kreuz.png")
def a():
    print("bsjufbh")

meldung= Label( fenster , text="Gewinner: ")
knopf1=Button(fenster,image=img,command=a)
knopf2=Button(fenster,image=img,command=a)
knopf3=Button(fenster,image=img,command=a)
knopf4=Button(fenster,image=img,command=a)
knopf5=Button(fenster,image=img,command=a)
knopf6=Button(fenster,image=img,command=a)
knopf7=Button(fenster,image=img,command=a)
knopf8=Button(fenster,image=img,command=a)
knopf9=Button(fenster,image=img,command=a)

knopf1.place(x=50,y=70)
knopf2.place(x=90,y=70)
knopf3.place(x=130,y=70)
knopf4.place(x=50,y=110)
knopf5.place(x=90,y=110)
knopf6.place(x=130,y=110)
knopf7.place(x=50,y=150)
knopf8.place(x=90,y=150)
knopf9.place(x=130,y=150)
meldung.pack()


        
def auswertung():
            
    if knoepfe[10]==1:
        knoepfe[10]=0
    else :
        knoepfe[10]=1
                    
                
    if ((knoepfe[0] and knoepfe[1] and knoepfe[2]) or (knoepfe[3]and knoepfe[4]and knoepfe[5])or(knoepfe[6] and  knoepfe[7] and  knoepfe[8]) or (knoepfe[0] and  knoepfe[3] and  knoepfe[6]) or (knoepfe[1] and  knoepfe[4] and  knoepfe[7]) or (knoepfe[2] and  knoepfe[5] and  knoepfe[8]) or (knoepfe[0] and  knoepfe[4] and  knoepfe[8]) or (knoepfe[2] and  knoepfe[4] and knoepfe[6]))== 1:
            meldung.config(text="Gewinner: kreis" ,bg="yellow")
    elif(( knoepfe[0] and  knoepfe[1] and  knoepfe[2] )or (knoepfe[3] and  knoepfe[4] and  knoepfe[5]) or (knoepfe[6] and  knoepfe[7] and  knoepfe[8]) or( knoepfe[0] and  knoepfe[3] and  knoepfe[6]) or (knoepfe[1] and  knoepfe[4] and  knoepfe[7]) or (knoepfe[2] and  knoepfe[5] and  knoepfe[8]) or (knoepfe[0] and  knoepfe[4] and  knoepfe[8]) or (knoepfe[2] and  knoepfe[4] and  knoepfe[6]))== 2:
        meldung.config(text="Gewinner: kreuz" ,bg="yellow")
    knoepfe[9]+=1
            #unentschieden
    if knoepfe[9]==9:
        print ("unentschieden")

def a():
    print("bsjufbh")
def knopfdruecken1():
    
    if knoepfe[10]==1:
        knopf1.config(image=img_kreis,command=a)
        knoepfe[0]=1
    else:
        knopf1.config(image=img_kreuz)
        knoepfe[0]=2
    auswertung()
def knopfdruecken2():
   
    if knoepfe[10]==1:
        knopf2.config(image=img_kreis,command=a)
        knoepfe[1]=1
    else:
        knopf2.config(image=img_kreuz)
        knoepfe[1]=2
    auswertung()
def knopfdruecken3():
 
    if knoepfe[10]==1:
        knopf3.config(image=img_kreis,command=a)
        knoepfe[2]=1
    else:
        knopf3.config(image=img_kreuz)
        knoepfe[2]=2
    auswertung()
def knopfdruecken4():
   
    if knoepfe[10]==1:
        knopf4.config(image=img_kreis,command=a)
        knoepfe[3]=1
    else:
        knopf4.config(image=img_kreuz)
        knoepfe[3]=2
    auswertung()
def knopfdruecken5():
    
    if knoepfe[10]==1:
        knopf5.config(image=img_kreis,command=a)
        knoepfe[4]=1
    else:
        knopf5.config(image=img_kreuz)
        knoepfe[4]=2
    auswertung()
def knopfdruecken6():
   
    if knoepfe[10]==1:
        knopf6.config(image=img_kreis,command=a)
        knoepfe[5]=1
    else:
        knopf6.config(image=img_kreuz)
        knoepfe[5]=2
    auswertung()
def knopfdruecken7():
   
    if knoepfe[10]==1:
        knopf7.config(image=img_kreis,command=a)
        knoepfe[6]=1
    else:
        knopf7.config(image=img_kreuz)
        knoepfe[6]=2
    auswertung()
def knopfdruecken8():
    
    if knoepfe[10]==1:
        knopf8.config(image=img_kreis,command=a)
        knoepfe[7]=1
    else:
        knopf8.config(image=img_kreuz)
        knoepfe[7]=2
    auswertung()
def knopfdruecken9():
   
    if knoepfe[10]==1:
        knopf9.config(image=img_kreis,command=a)
        knoepfe[8]=1
    else:
        knopf9.config(image=img_kreuz)
        knoepfe[8]=2
    auswertung()
    
knopf1.config(command=knopfdruecken1)
knopf2.config(command=knopfdruecken2)
knopf3.config(command=knopfdruecken3)
knopf4.config(command=knopfdruecken4)
knopf5.config(command=knopfdruecken5)
knopf6.config(command=knopfdruecken6)
knopf7.config(command=knopfdruecken7)
knopf8.config(command=knopfdruecken8)
knopf9.config(command=knopfdruecken9)
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi jado

Verstehst du wie das folgende Skript abläuft und funktioniert es bei dir? (Das Skript bezieht sich vorläufig nur auf die Layouterstellung):

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from functools import partial
import tkinter as tk

FENSTER_TITLE = "TickTackToe Spiel"
FENSTER_XPOS = 100
FENSTER_YPOS = 100
FENSTER_WIDTH = 300
FENSTER_HEIGHT = 300
KNOPF_RAHMEN_RAND = 10

KNOEPFE = knoepfe = [
    ["knopf1","knopf2","knopf3"],
    ["knopf4","knopf5","knopf6"],
    ["knopf7","knopf8","knopf9"]
    ] #,0,1]

LEEHR = "leer.png"
KREIS = "kreis.png"
KREUZ = "kreuz.png"


def knopf_druck(knopf):
    print("Knopf gedrückt:", knopf)
         
fenster = tk.Tk()
fenster.title(FENSTER_TITLE)
#fenster.geometry("+{}+{}".format(FENSTER_XPOS, FENSTER_YPOS))
#fenster.geometry("{}x{}".format(FENSTER_WIDTH, FENSTER_HEIGHT))

img_leer = tk.PhotoImage(file=LEEHR)
img_kreis = tk.PhotoImage(file=KREIS)
ima_kreuz = tk.PhotoImage(file=KREUZ)

knopf_rahmen = tk.Frame(fenster)
knopf_rahmen_rand = KNOPF_RAHMEN_RAND
knopf_rahmen.pack(expand=True, padx=knopf_rahmen_rand, pady=knopf_rahmen_rand)

meine_knoepfe = list()
for reihe, knopf_reihe in enumerate(KNOEPFE):
    for zeile , knopf in enumerate(knopf_reihe):
        knopf_widget = tk.Button(knopf_rahmen, image=img_leer,
            highlightthickness=0, command=partial(knopf_druck, knopf))
        knopf_widget.grid(row=reihe, column=zeile)
        meine_knoepfe.append(knopf_widget)
    
fenster.mainloop()
Gruss wuf :wink:
Take it easy Mates!
jado
User
Beiträge: 13
Registriert: Montag 5. Februar 2018, 15:29

ja es klappt und ich verstehe es größtenteils ich weiß nur nicht was dieses partial beim command heißen soll und dass enumerate
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schon mal in die Dokumentation geschaut? Da ist das erklärt.
jado
User
Beiträge: 13
Registriert: Montag 5. Februar 2018, 15:29

wie soll ich den jz auf die einzelnen knöpfe zugreifen um das bild beim knopfdruck zu ändern
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du bekommst doch den Knopf als Argument. Dann kannst du den doch umkonfigurieren.
jado
User
Beiträge: 13
Registriert: Montag 5. Februar 2018, 15:29

ok Vielen dank
jado
User
Beiträge: 13
Registriert: Montag 5. Februar 2018, 15:29

ja aber es werden ja alle buttons knopf_widget gennant wie soll ich den auf einen von denen zugreifen?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nochmal: in deinem command ‚knopf_druck‘ bekommst du ein Argument. Das ist der Knopf den du brauchst, genau dann wenn du ihn brauchst.
jado
User
Beiträge: 13
Registriert: Montag 5. Februar 2018, 15:29

Ja ok ich habs kappiert
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi jado

Hast du schon etwas an Dokumentation betreffs partial gefunden? Wenn du bei einem Tkinter-Widget mit der command-option ein Funktion bzw. Methode aufrufen möchtest kannst du dies nur mit der Referenz auf die Funktion bzw. Methode. Das sieht dann wie folgt aus:
..., command=FUNKTION, bzw. command=self.METHODE,...
hiermit kannst du aber keine Variabel bzw. Argumente an die Funktion bzw Methode übertragen da nur ihre Referenz aufgerufen wird. Das heisst das folgende funktioniert nicht:
..., command=FUNKTION(variable), command=self.METHODE(Argument),...
somit funktioniert auch der Aufruf einer Funktion bzw. Methode mit Zugabe nicht:
..., command=FUNKTION(), command=self.METHODE(),...
Möchte man aber eine Funktion bzw. Methode mit Zugabe aufrufen steht normalerweise eine Methode lambda zur Verfügung. Dies sieht dann wie folgt aus:
...,command=lambda var=variable: FUNKTION(var), command=lambda arg: self.METHODE(arg),...
wenn einem lambda wie mir nicht so gefällt stellt Python eine Funktion partial zur Verfügung, welche aber importiert werden muss! Das passiert mit:
from functools import partial
Nun gestaltet sich das ganze wie folgt:
..., command=partal(FUNKTION, Variable-1, Variable-2,...Variable-x), command=partal(self.METHODE, Argument-1, Argument-2....Argument-x),...
In unserem Fall möchte ich den Namen des gedrückten Knopfes an die Funktion knopf_druck übertragen. Dies ist dann wie du in meinem Skript siehst für jeden Knopf (Button):
...,command=partial(knopf_druck, knopf),...
Du siehst welchen Aufwand es benötigt ein Wort wie partial im Detail zu erklären. (Für mich wenigstens). Darum werde ich dies nur einmal schreiben und für eventuelle Wiederholungen archivieren.

Hoffe du verstehst jetzt was mit partial gemeint ist. Verstehst du Klassen in Python?
Gruss wuf :wink:
Take it easy Mates!
jado
User
Beiträge: 13
Registriert: Montag 5. Februar 2018, 15:29

Danke für die Hilfe ich hab es glaub ich soweit verstanden bin gerade dabei es ein bisschen weiter zu entwickeln also mit Auswertung und Wiederholungen ...
jado
User
Beiträge: 13
Registriert: Montag 5. Februar 2018, 15:29

Klassen Verstehe ich schon aber weiß nicht so richtig sie anzuwenden
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Ok jado

Dann verwandeln wir das Skript von:
viewtopic.php?p=323504#p323504
ein wenig und verwenden eine Klasse:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from functools import partial
import tkinter as tk

FENSTER_TITLE = "TickTackToe Spiel"
FENSTER_XPOS = 100
FENSTER_YPOS = 100
FENSTER_WIDTH = 300
FENSTER_HEIGHT = 300
KNOPF_RAHMEN_RAND = 10

KNOEPFE = knoepfe = [
    ["knopf1","knopf2","knopf3"],
    ["knopf4","knopf5","knopf6"],
    ["knopf7","knopf8","knopf9"]
    ] #,0,1]

LEEHR = "leer.png"
KREIS = "kreis.png"
KREUZ = "kreuz.png"


class MeinTickTackToe(object):

    def __init__(self, fenster):
        self.fenster = fenster

        self.img_leer = tk.PhotoImage(file=LEEHR)
        self.img_kreis = tk.PhotoImage(file=KREIS)
        self.ima_kreuz = tk.PhotoImage(file=KREUZ)
        self.knoepfe = list()
        
        self.build()
        
    def build(self):
        self.knopf_rahmen = tk.Frame(self.fenster)
        self.knopf_rahmen.pack(expand=True, padx=KNOPF_RAHMEN_RAND,
            pady=KNOPF_RAHMEN_RAND)

        for reihe, knopf_reihe in enumerate(KNOEPFE):
            for zeile , knopf in enumerate(knopf_reihe):
                knopf_widget = tk.Button(self.knopf_rahmen, image=self.img_leer,
                    highlightthickness=0, command=partial(
                    self.knopf_druck, knopf))
                knopf_widget.grid(row=reihe, column=zeile)
                self.knoepfe.append(knopf_widget)
        

    def knopf_druck(self, knopf):
        print("Knopf gedrückt:", knopf)

def main():
    fenster = tk.Tk()
    fenster.title(FENSTER_TITLE)
    # Position des Fensters
    #fenster.geometry("+{}+{}".format(FENSTER_XPOS, FENSTER_YPOS))
    # Abmessungen des Fensters
    #fenster.geometry("{}x{}".format(FENSTER_WIDTH, FENSTER_HEIGHT))
    app = MeinTickTackToe(fenster)
    fenster.mainloop()
 
 
if __name__ == '__main__':
    main()
Studiere, experimentiere und versuche das Skript zu verstehen. Beachte die vielen self's (Referenz der Klasse bindet Attribute und Methoden an die Klasse)

Gruss wuf :wink:
Take it easy Mates!
jado
User
Beiträge: 13
Registriert: Montag 5. Februar 2018, 15:29

ich hab das mal ohne auf dein beispiel zu achten weiter gemacht und würde gerne mal von dir hören was du verbessern würdest

Code: Alles auswählen

from functools import partial
import tkinter as tk
class Ticktacktoe(): 
    def __init__(self):
        self.FENSTER_TITLE = "TickTackToe Spiel"
        self.FENSTER_XPOS = 1000
        self.FENSTER_YPOS = 100
        self.FENSTER_WIDTH = 300
        self.FENSTER_HEIGHT = 200
        self.KNOPF_RAHMEN_RAND = 2
        self.RUNDEN=self.runden=0
        self.SPIELER=self.spieler=1
        self.KNOEPFE = self.knoepfe = [
            ["knopf1","knopf2","knopf3"],
            ["knopf4","knopf5","knopf6"],
            ["knopf7","knopf8","knopf9"]]
        self.knoepfe_list = ["knopf1","knopf2","knopf3","knopf4","knopf5","knopf6","knopf7","knopf8","knopf9"]
        self.KNOPF_STATUS=self.Ks=["","","","","","","","",""]
        self.LEEHR = "leer.png"
        self.KREIS = "kreis.png"
        self.KREUZ = "kreuz.png"
                 
        self.fenster = tk.Tk()
        self.fenster.title(self.FENSTER_TITLE)
        self.fenster.geometry("+{}+{}".format(self.FENSTER_XPOS, self.FENSTER_YPOS))
        self.fenster.geometry("{}x{}".format(self.FENSTER_WIDTH, self.FENSTER_HEIGHT))
         
        self.img_leer = tk.PhotoImage(file=self.LEEHR)
        self.img_kreis = tk.PhotoImage(file=self.KREIS)
        self.img_kreuz = tk.PhotoImage(file=self.KREUZ)
        self.feld_bauen()
        self.fenster.mainloop()
    def feld_bauen(self):
        self.meldung=tk.Label( self.fenster,text="Gewinner:")
        self.meldung.pack()
        self.knopf_rahmen = tk.Frame(self.fenster)
        self.knopf_rahmen_rand = self.KNOPF_RAHMEN_RAND
        self.knopf_rahmen.pack(expand=False, padx=0, pady=0 ,side="left")
        self.meine_knoepfe = list()
        self.reset_Bt=tk.Button(self.fenster,text="Wiederholung?",bg="yellow",command=self.reset_comand)
        for self.reihe, knopf_reihe in enumerate(self.KNOEPFE):
            for self.zeile , knopf in enumerate(knopf_reihe):
                self.knopf_widget = tk.Button(self.knopf_rahmen, image=self.img_leer,highlightthickness=0, command=partial(self.knopf_druck, knopf))
                self.knopf_widget.grid(row=self.reihe, column=self.zeile)
                self.meine_knoepfe.append(self.knopf_widget)
    def a(self):
        print("a")
    def reset_comand(self):
        self.Ks=["","","","","","","","",""]
        self.runden=0
        self.spieler=1
        self.meldung.destroy()
        self.knopf_rahmen.destroy()
        self.meine_knoepfe=[]
        self.reset_Bt.destroy()
        self.feld_bauen()
    def knopf_druck(self,knopf):
        global SPIELER,runden
        if self.spieler==1:
            self.spieler=2
            self.NEUES_BILD=self.img_kreis
            self.Farbe="red"
            self.Ks[int(knopf[5])-1]="kreis"
        elif self.spieler==2:
            self.spieler=1
            self.NEUES_BILD=self.img_kreuz
            self.Farbe="green"
            self.Ks[int(knopf[5])-1]="kreuz"

        self.meine_knoepfe[int(knopf[5])-1].configure(image= self.NEUES_BILD,command=self.a, bg=self.Farbe) 

        if (self.Ks[0] == self.Ks[1] == self.Ks[2]=="kreuz")or(self.Ks[3] == self.Ks[4] == self.Ks[5]=="kreuz")or(self.Ks[6] == self.Ks[7] == self.Ks[8]=="kreuz")or(self.Ks[0] == self.Ks[3] == self.Ks[6]=="kreuz")or(self.Ks[1] == self.Ks[4] == self.Ks[7]=="kreuz")or(self.Ks[2] == self.Ks[5] == self.Ks[8]=="kreuz")or(self.Ks[0] == self.Ks[4] == self.Ks[8]=="kreuz")or(self.Ks[2] == self.Ks[4] == self.Ks[6]=="kreuz"):
            self.meldung.config(text="Gewinner: kreuz")
            self.reset_Bt.place(y=90,x=100)
        if (self.Ks[0] == self.Ks[1] == self.Ks[2]=="kreis")or(self.Ks[3] == self.Ks[4] == self.Ks[5]=="kreis")or(self.Ks[6] == self.Ks[7] == self.Ks[8]=="kreis")or(self.Ks[0] == self.Ks[3] == self.Ks[6]=="kreis")or(self.Ks[1] == self.Ks[4] == self.Ks[7]=="kreis")or(self.Ks[2] == self.Ks[5] == self.Ks[8]=="kreis")or(self.Ks[0] == self.Ks[4] == self.Ks[8]=="kreis")or(self.Ks[2] == self.Ks[4] == self.Ks[6]=="kreis"):
            self.meldung.config(text="Gewinner: kreis")
            self.reset_Bt.place(y=90,x=100)
        self.runden+=1
        #Unentschieden
        if self.runden==9:
            self.meldung.config(text="Unentschieden")
            self.reset_Bt.place(y=90,x=100)
   
Ticktacktoe()
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi jado

Gut ist nicht ganz mein Stiel. Dieser ist aber bei jedem unterschiedlich. Wenn es für dich stimmt, das Skript funktioniert und du die Übersicht noch hast ist es wohl Ok. Solltest du noch weitere Hilfe benötigen gibt es hier im Forum sicher Antworten.

Gruss wuf :wink:
Take it easy Mates!
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast sehr viele Dopplungen und unnötigen Variablen.

self.knopf_widget, self.zeile, self.reihe sind überflüssig als Instanz-Variablen. Nimm das self weg.

self.KNOEPFE, self.knoepfe und self.knoepfe_list sind alles das gleiche. Und überflüssig. Nimm stattdessen ein range(3) und leg die statt einer Liste von Buttons ein Wörterbuch an, mit dem du deine knopf nachschlagen kannst ohne seine Index mühselig aus einem String zu erstellen.

Code: Alles auswählen

self.buttons = {}
for x in range(3):
     for y in range(3):
         key = (x, y)
         button = self.buttons[key] = Button(..., command=partial(self.action, key)


Dann kannst du in dem command gleich self.buttons[knopf] machen.
jado
User
Beiträge: 13
Registriert: Montag 5. Februar 2018, 15:29

Ja danke
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi jado

Habe doch noch versucht dein Skript in meines zu integrieren ohne es weiter zu optimieren. Somit entstand der folgende Wurf:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from functools import partial
import tkinter as tk

FENSTER_TITLE = "TickTackToe Spiel"
FENSTER_XPOS = 100
FENSTER_YPOS = 100
FENSTER_WIDTH = 250
FENSTER_HEIGHT = 200


class TickTackToe(object):
    KNOPF_RAHMEN_RAND = 10

    KNOEPFE = [
        ["knopf1","knopf2","knopf3"],
        ["knopf4","knopf5","knopf6"],
        ["knopf7","knopf8","knopf9"]
        ] 

    LEEHR = "leer.png"
    KREIS = "kreis.png"
    KREUZ = "kreuz.png"

    def __init__(self, fenster):
        self.fenster = fenster

        self.img_leer = tk.PhotoImage(file=self.LEEHR)
        self.img_kreis = tk.PhotoImage(file=self.KREIS)
        self.img_kreuz = tk.PhotoImage(file=self.KREUZ)
        self.knoepfe = dict()
        self.runden = 0
        self.spieler = 1
        
        self.feld_bauen()
        
    def feld_bauen(self):
        self.melde_text_var = tk.StringVar()
        self.meldung = tk.Label( self.fenster, textvariable=self.melde_text_var,
            font=('Helvetica', 12, 'bold'))
        self.meldung.pack(pady=4)
        self.melde_text_var.set("Neues Spiel")
        
        self.knopf_rahmen = tk.Frame(self.fenster)
        self.knopf_rahmen.pack(expand=True, padx=self.KNOPF_RAHMEN_RAND,
            pady=self.KNOPF_RAHMEN_RAND)

        for reihe, knopf_reihe in enumerate(self.KNOEPFE):
            for zeile , knopf in enumerate(knopf_reihe):
                knopf_widget = tk.Button(self.knopf_rahmen, image=self.img_leer,
                    highlightthickness=0, bg='white', command=partial(
                    self.knopf_druck, knopf))
                knopf_widget.grid(row=reihe, column=zeile)
                self.knoepfe[knopf] = dict()
                self.knoepfe[knopf]['widget'] = knopf_widget
                self.knoepfe[knopf]['status'] = ""

        self.reset_button = tk.Button(self.fenster,text="Wiederholung?",
            bg="yellow", command=self.reset_command)
        self.reset_button.pack(pady=4)
        self.reset_button.pack_forget()
        
    def reset_command(self):
        for reihe, knopf_reihe in enumerate(self.KNOEPFE):
            for zeile , knopf in enumerate(knopf_reihe):
                self.knoepfe[knopf]['widget'].configure(image=self.img_leer,
                    bg='white')
                self.knoepfe[knopf]['status'] = ""
        self.runden=0
        self.spieler=1
        self.melde_text_var.set("Neues Spiel")
        self.reset_button.pack_forget()
        
    def knopf_druck(self, knopf):
        print("Knopf gedrückt:", knopf)
        
        if self.spieler == 1:
            self.spieler = 2
            farbe = 'red'
            bild = self.img_kreis
            self.knoepfe[knopf]['status'] = 'Kreis'
        elif self.spieler == 2:
            self.spieler = 1
            farbe = 'green'
            bild = self.img_kreuz
            self.knoepfe[knopf]['status'] = 'Kreuz'
        
        self.knoepfe[knopf]['widget'].configure(image=bild, bg=farbe)
        
        if (self.knoepfe['knopf1']['status'] ==\
            self.knoepfe['knopf2']['status'] ==\
            self.knoepfe['knopf3']['status'] == 'Kreuz') or\
           (self.knoepfe['knopf4']['status'] ==\
            self.knoepfe['knopf5']['status'] ==\
            self.knoepfe['knopf6']['status'] == 'Kreuz') or\
           (self.knoepfe['knopf7']['status'] ==\
            self.knoepfe['knopf8']['status'] ==\
            self.knoepfe['knopf9']['status'] == 'Kreuz') or\
           (self.knoepfe['knopf1']['status'] ==\
            self.knoepfe['knopf4']['status'] ==\
            self.knoepfe['knopf7']['status'] == 'Kreuz') or\
           (self.knoepfe['knopf2']['status'] ==\
            self.knoepfe['knopf5']['status'] ==\
            self.knoepfe['knopf8']['status'] == 'Kreuz') or\
           (self.knoepfe['knopf3']['status'] ==\
            self.knoepfe['knopf6']['status'] ==\
            self.knoepfe['knopf9']['status'] == 'Kreuz') or\
           (self.knoepfe['knopf1']['status'] ==\
            self.knoepfe['knopf5']['status'] ==\
            self.knoepfe['knopf9']['status'] == 'Kreuz') or\
           (self.knoepfe['knopf3']['status'] ==\
            self.knoepfe['knopf5']['status'] ==\
            self.knoepfe['knopf7']['status'] == 'Kreuz'):
 
            self.melde_text_var.set("Gewinner: Kreuz")
            self.reset_button.pack(pady=4)

        if (self.knoepfe['knopf1']['status'] ==\
            self.knoepfe['knopf2']['status'] ==\
            self.knoepfe['knopf3']['status'] == 'Kreis') or\
           (self.knoepfe['knopf4']['status'] ==\
            self.knoepfe['knopf5']['status'] ==\
            self.knoepfe['knopf6']['status'] == 'Kreis') or\
           (self.knoepfe['knopf7']['status'] ==\
            self.knoepfe['knopf8']['status'] ==\
            self.knoepfe['knopf9']['status'] == 'Kreis') or\
           (self.knoepfe['knopf1']['status'] ==\
            self.knoepfe['knopf4']['status'] ==\
            self.knoepfe['knopf7']['status'] == 'Kreis') or\
           (self.knoepfe['knopf2']['status'] ==\
            self.knoepfe['knopf5']['status'] ==\
            self.knoepfe['knopf8']['status'] == 'Kreis') or\
           (self.knoepfe['knopf3']['status'] ==\
            self.knoepfe['knopf6']['status'] ==\
            self.knoepfe['knopf9']['status'] == 'Kreuz') or\
           (self.knoepfe['knopf1']['status'] ==\
            self.knoepfe['knopf5']['status'] ==\
            self.knoepfe['knopf9']['status'] == 'Kreis') or\
           (self.knoepfe['knopf3']['status'] ==\
            self.knoepfe['knopf5']['status'] ==\
            self.knoepfe['knopf7']['status'] == 'Kreis'):
            
            self.melde_text_var.set("Gewinner: Kreis")
            self.reset_button.pack(pady=4)
            
        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)
    # Position des Fensters
    fenster.geometry("+{}+{}".format(FENSTER_XPOS, FENSTER_YPOS))
    # Abmessungen des Fensters
    fenster.geometry("{}x{}".format(FENSTER_WIDTH, FENSTER_HEIGHT))
    
    app = TickTackToe(fenster)
    
    fenster.mainloop()
 
 
if __name__ == '__main__':
    main()
Viel Spass!

Gruss wuf :wink:
Take it easy Mates!
Antworten