Seite 1 von 2
Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 09:49
von jado
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))
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 10:31
von jado
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)
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 12:08
von wuf
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

Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 13:37
von jado
ja es klappt und ich verstehe es größtenteils ich weiß nur nicht was dieses partial beim command heißen soll und dass enumerate
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 13:56
von __deets__
Schon mal in die Dokumentation geschaut? Da ist das erklärt.
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 14:43
von jado
wie soll ich den jz auf die einzelnen knöpfe zugreifen um das bild beim knopfdruck zu ändern
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 14:45
von __deets__
Du bekommst doch den Knopf als Argument. Dann kannst du den doch umkonfigurieren.
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 14:54
von jado
ok Vielen dank
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 14:56
von jado
ja aber es werden ja alle buttons knopf_widget gennant wie soll ich den auf einen von denen zugreifen?
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 15:08
von __deets__
Nochmal: in deinem command ‚knopf_druck‘ bekommst du ein Argument. Das ist der Knopf den du brauchst, genau dann wenn du ihn brauchst.
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 15:21
von jado
Ja ok ich habs kappiert
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 15:24
von wuf
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

Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 17:35
von jado
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 ...
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 17:36
von jado
Klassen Verstehe ich schon aber weiß nicht so richtig sie anzuwenden
Re: Button aktiviert sich automatisch
Verfasst: Sonntag 25. März 2018, 18:30
von wuf
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

Re: Button aktiviert sich automatisch
Verfasst: Montag 26. März 2018, 15:54
von jado
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()
Re: Button aktiviert sich automatisch
Verfasst: Montag 26. März 2018, 19:46
von wuf
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

Re: Button aktiviert sich automatisch
Verfasst: Montag 26. März 2018, 20:07
von __deets__
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.
Re: Button aktiviert sich automatisch
Verfasst: Montag 26. März 2018, 20:39
von jado
Ja danke
Re: Button aktiviert sich automatisch
Verfasst: Dienstag 27. März 2018, 00:56
von wuf
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
