Hallo! Ich bin ein Schüler und wir nehmen gerade in der Schule Python durch... (nicht gerade einfach wie ich finde )Nun ja ich sehe ,dass es
hier sogar ein forum gibt und von daher frage ich mich ob ihr mir helfen könnt.*hoff*Ich habe schon etliche Homepages besucht und mir von denen Infos geholt ,aber trotzdem blicke ich durch einige Programme noch nicht ganz durch ....
nr1:Eine "Klassen" Aufgabe
#!/usr/bin/env python
from Tkinter import *
root = Tk()
class Tier(Label):
def __init__(self,name):
self.name = StringVar(root)
Label.__init__(self,root,textvariable=self.name,relief="ridge")
self.pack(side=LEFT)
self.name.set(name)
self.n = name
self.bind("<Button-1>",self.gibLaut)
self.bind("<Button-3>",self.setName)
def gibLaut(self,e):
pass
def setName(self,e):
pass
class Hund(Tier):
def gibLaut(self,e):
self.name.set(self.n+": Wuff, wuff,...")
def setName(self,e):
self.name.set(self.n)
class Katze(Tier):
def gibLaut(self,e):
self.name.set(self.n+": Miau, miau ,...")
def setName(self,e):
self.name.set(self.n)
class Vogel(Tier):
def gibLaut(self,e):
self.name.set(self.n+": Tschiep, Tschiep, ...")
def setName(self,e):
self.name.set(self.n)
# ---------------------------------
# Hauptprogramm
tiere = []
tiere.append(Hund("Bello"))
tiere.append(Hund("Karo"))
tiere.append(Hund("Caesar"))
tiere.append(Katze("Mieze"))
tiere.append(Katze("Rolli"))
tiere.append(Vogel("Piepmatz"))
tiere.append(Vogel("Gööröödt"))
root.mainloop()
nr2 8-Damen
#!/usr/bin/env python2.1
from Tkinter import *
import tkMessageBox
root = Tk()
# ========================================
class Feld (Label): # erbt alle(!) Methoden und Attribute von "Label"
def __init__(self,parent,x,y):
Label.__init__(self,parent,width=8,height=4,relief="ridge")
self.x = x
self.y = y
self.bz = 0
self.dame = 0
self.bind("<Button-1>",self.setzeDame)
self.bind("<Button-3>",self.loescheDame)
self.pack(side=LEFT)
self.farbe()
def reset(self):
self.bz = 0
self.dame = 0
self.configure(text="")
def farbe(self):
if self.bz == 0:
if (self.x + self.y) % 2 == 0:
self.configure(bg="White")
else:
self.configure(bg="Gray")
else:
self.configure(bg="Red")
def setzeDame(self,e=None):
if (self.dame == 0) and (self.bz == 0):
self.configure(text="x")
self.dame = 1
self.bedroht(1)
self.faerbeNord(1)
self.faerbeNordOst(1)
self.faerbeOst(1)
self.faerbeSuedOst(1)
self.faerbeSued(1)
self.faerbeSuedWest(1)
self.faerbeWest(1)
self.faerbeNordWest(1)
farbeSetzen()
def bedroht(self,n):
self.bz = self.bz + n
def istBedroht(self):
return (self.bz > 0)
def loescheDame(self,e=None):
if self.dame == 1:
self.configure(text="")
self.dame = 0
self.bedroht(-1)
self.faerbeNord(-1)
self.faerbeNordOst(-1)
self.faerbeOst(-1)
self.faerbeSuedOst(-1)
self.faerbeSued(-1)
self.faerbeSuedWest(-1)
self.faerbeWest(-1)
self.faerbeNordWest(-1)
farbeSetzen()
def faerbeNord(self,n):
if self.x-1 >= 0:
f[self.x-1][self.y].bedroht(n)
f[self.x-1][self.y].faerbeNord(n)
def faerbeNordOst(self,n):
if (self.x-1 >= 0) and (self.y+1 <=7):
f[self.x-1][self.y+1].bedroht(n)
f[self.x-1][self.y+1].faerbeNordOst(n)
def faerbeOst(self,n):
if self.y+1 <= 7:
f[self.x][self.y+1].bedroht(n)
f[self.x][self.y+1].faerbeOst(n)
def faerbeSuedOst(self,n):
if (self.x+1 <= 7) and (self.y+1 <= 7):
f[self.x+1][self.y+1].bedroht(n)
f[self.x+1][self.y+1].faerbeSuedOst(n)
def faerbeSued(self,n):
if self.x+1 <= 7:
f[self.x+1][self.y].bedroht(n)
f[self.x+1][self.y].faerbeSued(n)
def faerbeSuedWest(self,n):
if (self.x+1 <= 7 ) and (self.y-1 >= 0):
f[self.x+1][self.y-1].bedroht(n)
f[self.x+1][self.y-1].faerbeSuedWest(n)
def faerbeWest(self,n):
if self.y-1 >= 0:
f[self.x][self.y-1].bedroht(n)
f[self.x][self.y-1].faerbeWest(n)
def faerbeNordWest(self,n):
if (self.x-1 >= 0 ) and (self.y-1 >= 0):
f[self.x-1][self.y-1].bedroht(n)
f[self.x-1][self.y-1].faerbeNordWest(n)
# ========================================
def farbeSetzen():
x = 0
while x < breite:
y = 0
while y < hoehe:
f[x][y].farbe()
y += 1
x += 1
# ========================================
def sucheAlleLoesungen():
global liste
global fertig
global loesung
zeile = 0 # Nmmer der zu besetzenden Zeile
liste = range(8) # Liste der unbesetzten Spalten
loesung= []
fertig = 0
sucheLoesung(0)
# ========================================
def sucheLoesung(zeile):
global fertig
if fertig != 1:
if zeile == hoehe:
anzahl.set(anzahl.get()+1) # schon wieder eine Lösung gefunden
loesungsString.set(str(loesung))
if not (tkMessageBox.askyesno(title="Weiter?", message="Soll nach weiteren Lösungen gesucht werden?")):
fertig = 1
else:
for spalte in liste:
if not f[zeile][spalte].istBedroht():
f[zeile][spalte].setzeDame()
loesung.append(spalte+1)
sucheLoesung(zeile+1)
f[zeile][spalte].loescheDame()
loesung.remove(spalte+1)
# ========================================
def reset():
x = 0
while x < breite:
y = 0
while y < hoehe:
f[x][y].reset()
f[x][y].farbe()
y += 1
x += 1
anzahl.set(0)
loesungsString.set("")
# ========================================
# Das Hauptprogramm
#========================================
hoehe = 8
breite = 8
anzahl = IntVar(root)
loesungsString = StringVar(root)
anzahl.set(0)
f = range(breite)
x = 0
while x < breite:
frame = Frame(root)
f[x] = range(hoehe)
y = 0
while y < hoehe:
f[x][y] = Feld(frame,x,y)
y += 1
frame.pack(side=TOP)
x += 1
# Und nun noch ein paar Knöpfe
f1 = Frame(root)
start = Button(f1,text="Start", command=sucheAlleLoesungen)
anzahlLoes = Label(f1,textvariable=anzahl)
loesung = Label(f1,textvariable=loesungsString)
stop = Button(f1,text="Reset", command=reset)
start.pack (side=LEFT)
anzahlLoes.pack(side=LEFT)
stop.pack (side=RIGHT)
loesung.pack (side=RIGHT,fill="both")
f1.pack (side=TOP,fill="x")
root.mainloop()
kann mir jemand sagen wie diese 2 Programme funktionieren ?In meinem Python Buch stehen etliche von den Befehlen nicht drin und die Hps auf denen ich war helfen auch nicht
BITTE helft mir!
Ein Noob hat Probleme :(
Hi, schön, dass du hier ins Forum kommst . Aber bitte beachte zwei Sachen :
- bitte schreib dein Programm nochmal in code blöcke (einfach reinkopieren), so dass die Formatierung erhalten bleibt. Ohne die Formatierung kann man den Code nicht richtig deuten. Beispiel:
Code: Alles auswählen
def bla(x): return x
- ich verschieb dein Topic ins Gui-Forum, da es vor allem um TKinter geht.
nr1
nr2
so jetzt müsste es klappen. vielen dank nochmal an milan!!
( so aber wie funktionieren aber nun die programme?)
Code: Alles auswählen
#!/usr/bin/env python
from Tkinter import *
root = Tk()
class Tier(Label):
def __init__(self,name):
self.name = StringVar(root)
Label.__init__(self,root,textvariable=self.name,relief="ridge")
self.pack(side=LEFT)
self.name.set(name)
self.n = name
self.bind("<Button-1>",self.gibLaut)
self.bind("<Button-3>",self.setName)
def gibLaut(self,e):
pass
def setName(self,e):
pass
class Hund(Tier):
def gibLaut(self,e):
self.name.set(self.n+": Wuff, wuff,...")
def setName(self,e):
self.name.set(self.n)
class Katze(Tier):
def gibLaut(self,e):
self.name.set(self.n+": Miau, miau ,...")
def setName(self,e):
self.name.set(self.n)
class Vogel(Tier):
def gibLaut(self,e):
self.name.set(self.n+": Tschiep, Tschiep, ...")
def setName(self,e):
self.name.set(self.n)
# ---------------------------------
# Hauptprogramm
tiere = []
tiere.append(Hund("Bello"))
tiere.append(Hund("Karo"))
tiere.append(Hund("Caesar"))
tiere.append(Katze("Mieze"))
tiere.append(Katze("Rolli"))
tiere.append(Vogel("Piepmatz"))
tiere.append(Vogel("Gööröödt"))
root.mainloop()
nr2
Code: Alles auswählen
#!/usr/bin/env python2.1
from Tkinter import *
import tkMessageBox
root = Tk()
# ========================================
class Feld (Label): # erbt alle(!) Methoden und Attribute von "Label"
def __init__(self,parent,x,y):
Label.__init__(self,parent,width=8,height=4,relief="ridge")
self.x = x
self.y = y
self.bz = 0
self.dame = 0
self.bind("<Button-1>",self.setzeDame)
self.bind("<Button-3>",self.loescheDame)
self.pack(side=LEFT)
self.farbe()
def reset(self):
self.bz = 0
self.dame = 0
self.configure(text="")
def farbe(self):
if self.bz == 0:
if (self.x + self.y) % 2 == 0:
self.configure(bg="White")
else:
self.configure(bg="Gray")
else:
self.configure(bg="Red")
def setzeDame(self,e=None):
if (self.dame == 0) and (self.bz == 0):
self.configure(text="x")
self.dame = 1
self.bedroht(1)
self.faerbeNord(1)
self.faerbeNordOst(1)
self.faerbeOst(1)
self.faerbeSuedOst(1)
self.faerbeSued(1)
self.faerbeSuedWest(1)
self.faerbeWest(1)
self.faerbeNordWest(1)
farbeSetzen()
def bedroht(self,n):
self.bz = self.bz + n
def istBedroht(self):
return (self.bz > 0)
def loescheDame(self,e=None):
if self.dame == 1:
self.configure(text="")
self.dame = 0
self.bedroht(-1)
self.faerbeNord(-1)
self.faerbeNordOst(-1)
self.faerbeOst(-1)
self.faerbeSuedOst(-1)
self.faerbeSued(-1)
self.faerbeSuedWest(-1)
self.faerbeWest(-1)
self.faerbeNordWest(-1)
farbeSetzen()
def faerbeNord(self,n):
if self.x-1 >= 0:
f[self.x-1][self.y].bedroht(n)
f[self.x-1][self.y].faerbeNord(n)
def faerbeNordOst(self,n):
if (self.x-1 >= 0) and (self.y+1 <=7):
f[self.x-1][self.y+1].bedroht(n)
f[self.x-1][self.y+1].faerbeNordOst(n)
def faerbeOst(self,n):
if self.y+1 <= 7:
f[self.x][self.y+1].bedroht(n)
f[self.x][self.y+1].faerbeOst(n)
def faerbeSuedOst(self,n):
if (self.x+1 <= 7) and (self.y+1 <= 7):
f[self.x+1][self.y+1].bedroht(n)
f[self.x+1][self.y+1].faerbeSuedOst(n)
def faerbeSued(self,n):
if self.x+1 <= 7:
f[self.x+1][self.y].bedroht(n)
f[self.x+1][self.y].faerbeSued(n)
def faerbeSuedWest(self,n):
if (self.x+1 <= 7 ) and (self.y-1 >= 0):
f[self.x+1][self.y-1].bedroht(n)
f[self.x+1][self.y-1].faerbeSuedWest(n)
def faerbeWest(self,n):
if self.y-1 >= 0:
f[self.x][self.y-1].bedroht(n)
f[self.x][self.y-1].faerbeWest(n)
def faerbeNordWest(self,n):
if (self.x-1 >= 0 ) and (self.y-1 >= 0):
f[self.x-1][self.y-1].bedroht(n)
f[self.x-1][self.y-1].faerbeNordWest(n)
# ========================================
def farbeSetzen():
x = 0
while x < breite:
y = 0
while y < hoehe:
f[x][y].farbe()
y += 1
x += 1
# ========================================
def sucheAlleLoesungen():
global liste
global fertig
global loesung
zeile = 0 # Nmmer der zu besetzenden Zeile
liste = range(8) # Liste der unbesetzten Spalten
loesung= []
fertig = 0
sucheLoesung(0)
# ========================================
def sucheLoesung(zeile):
global fertig
if fertig != 1:
if zeile == hoehe:
anzahl.set(anzahl.get()+1) # schon wieder eine Lösung gefunden
loesungsString.set(str(loesung))
if not (tkMessageBox.askyesno(title="Weiter?", message="Soll nach weiteren Lösungen gesucht werden?")):
fertig = 1
else:
for spalte in liste:
if not f[zeile][spalte].istBedroht():
f[zeile][spalte].setzeDame()
loesung.append(spalte+1)
sucheLoesung(zeile+1)
f[zeile][spalte].loescheDame()
loesung.remove(spalte+1)
# ========================================
def reset():
x = 0
while x < breite:
y = 0
while y < hoehe:
f[x][y].reset()
f[x][y].farbe()
y += 1
x += 1
anzahl.set(0)
loesungsString.set("")
# ========================================
# Das Hauptprogramm
#========================================
hoehe = 8
breite = 8
anzahl = IntVar(root)
loesungsString = StringVar(root)
anzahl.set(0)
f = range(breite)
x = 0
while x < breite:
frame = Frame(root)
f[x] = range(hoehe)
y = 0
while y < hoehe:
f[x][y] = Feld(frame,x,y)
y += 1
frame.pack(side=TOP)
x += 1
# Und nun noch ein paar Knöpfe
f1 = Frame(root)
start = Button(f1,text="Start", command=sucheAlleLoesungen)
anzahlLoes = Label(f1,textvariable=anzahl)
loesung = Label(f1,textvariable=loesungsString)
stop = Button(f1,text="Reset", command=reset)
start.pack (side=LEFT)
anzahlLoes.pack(side=LEFT)
stop.pack (side=RIGHT)
loesung.pack (side=RIGHT,fill="both")
f1.pack (side=TOP,fill="x")
root.mainloop()
so jetzt müsste es klappen. vielen dank nochmal an milan!!
( so aber wie funktionieren aber nun die programme?)
so... ich hab mir deine Progs mal angeschaut und muss sagen, es sieht gut aus.
Was sollen die Progs laut Leherer oder Buch denn leisten? Oder was genau verstehst du net? Ist es nen Problem mit den Klassen oder mit Tkinter?
Das erste Programm könnte ich dir auch noch erklären, aber beim zweiten versteh nicht ganz, was es machen soll...
Was sollen die Progs laut Leherer oder Buch denn leisten? Oder was genau verstehst du net? Ist es nen Problem mit den Klassen oder mit Tkinter?
Das erste Programm könnte ich dir auch noch erklären, aber beim zweiten versteh nicht ganz, was es machen soll...
das zweite hmm : *grinst* nun ja wir sollen versuchen so viele damen wie möglich auf das brett zu bekommen bzw so wenig wie möglich -.-^^
das ist der eigenartige sinn *grinst*(ach ja und man versucht ja immer die schulstunden umzukriegen...)
so an fragen :
zu nr 1 : was bedeutet der komplette befehlskomplex ab
class tier(Label)
def_init__ wird manchmal als konstruktor oder sowas beschreiben ... was ist das?und wieso bekommt es dann immer self zugeteilt ? in wiefern fallen die folgenden argumente (also die ,die nach self stehen)im folgenden programm dann ins gewicht??um es kurz zu sagen hä ?
das hauptprogramm ist dann wieder logisch aber dieser mittlere teil pff ich habe keine ahnung
zu nr2 : nun ja da blicke ich gar nicht durch aber es ist auch eher nebensächlich nr 1 ist wichtiger .(ich glaube nr 2 gebe ich besser auf wie meine anderen kollegen es auch schon getan haben )
mfg
das ist der eigenartige sinn *grinst*(ach ja und man versucht ja immer die schulstunden umzukriegen...)
so an fragen :
zu nr 1 : was bedeutet der komplette befehlskomplex ab
class tier(Label)
def_init__ wird manchmal als konstruktor oder sowas beschreiben ... was ist das?und wieso bekommt es dann immer self zugeteilt ? in wiefern fallen die folgenden argumente (also die ,die nach self stehen)im folgenden programm dann ins gewicht??um es kurz zu sagen hä ?
das hauptprogramm ist dann wieder logisch aber dieser mittlere teil pff ich habe keine ahnung
zu nr2 : nun ja da blicke ich gar nicht durch aber es ist auch eher nebensächlich nr 1 ist wichtiger .(ich glaube nr 2 gebe ich besser auf wie meine anderen kollegen es auch schon getan haben )
mfg
Erstmal nur zum ersten Programm:
Um diese Programm zu verstehen, soltest Du zumindest grob wissen, was die Begriffe Klassen und Vererbung bedeuten. Ansonsten wird die Erklärung ziemlich schwierig... Falls Du später mal programmieren willst, kann ich Dir nur wärmstens empfehlen, mit dem Programm rumzuspielen, bis Du es wirklich verstanden hast. Es ist nicht schwer und lohnt sich. Weiterführende Literator findest Du z.B. hier oder hier
Zum Einzelnen: bewirkt, dass eine von der Tkinter-Klasse "Label" (deshalb auch das "Label" in Klammern hinter Tier) abgeleitete (man könnte sagen spezialisierte) Klasse erstellt wird. Label steht bei Tkinter für ein Stück nicht editierbaren Texts auf dem Bildschirm, eine Beschriftung halt. Bis auf weiteres erbt "Tier" alle Eigenschaften und Funktionen von "Label".
ist tatsächlich ein Konstruktor, d.h. der Code darin wird immer aufgerufen, wenn so ein Tier-Objekt im Programm erzeugt wird. In dem Konstruktor passieren jetzt ein paar Tkinter-Schweinereien, die vor allem dem Zweck dienen, nachträglich den Text des Labes ändern zu können. Das self ist eine Eigenheit der Art, wie in Python Objetorientierung implementiert ist. Alle Funktionen, die Teil einer Klasse sind (sog. Methoden), müssen als ersten Parameter die Variable "self" angegeben haben. Beim Aufruf einer solchen Funktion wird dieser Paramter aber nicht mit angegeben, sondern er wird vom Python-Interpreter automatisch eingefügt. Er dient dazu, dass die Funktion weiss, zu welcher Klasse sie gehört.
Hier wird jetzt rumgetrickts, damit man später noch an die Beschriftung des Labes rankommt. Deshalb bekommt in Zeile 1 die Klase ein Element "name" vom Typ StringVar verpasst, diesen Typ benutzt Tkinter intern zum speichern von Zeichenketten.
Dann wird der Konstruktor der "Vaterklasse" aufgerufen, die alles erledigt, was so ein Label beim erstellen erledigen muss, da wird auch der Verweis auf den Namen übergeben. "relief" gibt an, wie die Kante des Labels aussehen soll.
self.pack(...) steuert, wo das Label im Programmfenster später angezeigt werden wird (nämlich links).
Dann wird der Name mit dem Parameter "name" gesetzt, der "__init__" mitgegeben wurde. In der Variable "n" wird dann noch eine Kopie des Namens abgelegt, damit man später daran das Geräusch anfügen kann.
"bind" verknüpft noch bestimmte Maustasten mit Funktionenen, die dann später definiert werden. <Button-x> steht dabei für die x-te Maustaste.
Definiert leere Methoden (pass bedeutet "tue nichts" und ist notwendig, da Pyhon keine komplett leeren Funktionen erlaubt). Diese Methoden werden später von den von Tier abgeleiteten Klasen überschrieben (stichwort "abstrakte Methoden", wenn Du mal in der Literatur drüber stolperst).
So, wenn Du bis hierher mitgekommen bist, dann sollte Dir der Rest eigentlich keine Probleme mehr machen. Ein Kommentar aber trotzdem noch: Es ist eigentlich unnötig, die Methode "setName" bei jeder abgeleiteten Klasse zu definieren, das hätte lieber einmal bei "Tier" passieren sollen. Aber vielleicht sagst Du das deinem Lehrer lieber nicht ...
Wenn Du weiter Fragen hast frag ruhig.
kasimon
Um diese Programm zu verstehen, soltest Du zumindest grob wissen, was die Begriffe Klassen und Vererbung bedeuten. Ansonsten wird die Erklärung ziemlich schwierig... Falls Du später mal programmieren willst, kann ich Dir nur wärmstens empfehlen, mit dem Programm rumzuspielen, bis Du es wirklich verstanden hast. Es ist nicht schwer und lohnt sich. Weiterführende Literator findest Du z.B. hier oder hier
Zum Einzelnen:
Code: Alles auswählen
class Tier(Label):
Code: Alles auswählen
def __init__(self,...):
Code: Alles auswählen
self.name = StringVar(root)
Label.__init__(self,root,textvariable=self.name,relief="ridge")
self.pack(side=LEFT)
self.name.set(name)
self.n = name
self.bind("<Button-1>",self.gibLaut)
self.bind("<Button-3>",self.setName)
Dann wird der Konstruktor der "Vaterklasse" aufgerufen, die alles erledigt, was so ein Label beim erstellen erledigen muss, da wird auch der Verweis auf den Namen übergeben. "relief" gibt an, wie die Kante des Labels aussehen soll.
self.pack(...) steuert, wo das Label im Programmfenster später angezeigt werden wird (nämlich links).
Dann wird der Name mit dem Parameter "name" gesetzt, der "__init__" mitgegeben wurde. In der Variable "n" wird dann noch eine Kopie des Namens abgelegt, damit man später daran das Geräusch anfügen kann.
"bind" verknüpft noch bestimmte Maustasten mit Funktionenen, die dann später definiert werden. <Button-x> steht dabei für die x-te Maustaste.
Code: Alles auswählen
def gibLaut(self,e):
pass
def setName(self,e):
pass
So, wenn Du bis hierher mitgekommen bist, dann sollte Dir der Rest eigentlich keine Probleme mehr machen. Ein Kommentar aber trotzdem noch: Es ist eigentlich unnötig, die Methode "setName" bei jeder abgeleiteten Klasse zu definieren, das hätte lieber einmal bei "Tier" passieren sollen. Aber vielleicht sagst Du das deinem Lehrer lieber nicht ...
Wenn Du weiter Fragen hast frag ruhig.
kasimon
vielen dank kasimon! ich habe dank dir nun endlich das programm verstanden juhu übrigens du sagtest ja im vorletzten satz ,dass ich das besser nicht meinem lehrer sage .... nun ja der ist meiner meinung zwar info-lehrer ,aber im endeffekt hat er ahnung von nix ^^ . alles schaut der im buch nach und dann bricht er sich einen ab und versucht uns etwas zu erklären ... im endeffelt versteht man aber NIX!(nein wir reden nicht im unterricht *grinst*)lehrer ......
na ja trotzdem nochmal many thx !
na ja trotzdem nochmal many thx !
Gern geschehen. Ich wünschte wir hätten in der Schule statt Turbo Pascal (5.0) Python durchgenommen, mir wäre viel Streß erspart geblieben. Du kannst echt froh sein, dass ihr eine Sprache benutzt, die man sich umsonst runterladen kann und zu der es im Netz einigermaßen viel Doku gibt.
Viel Spaß weiterhin mit Python,
kasimon
Viel Spaß weiterhin mit Python,
kasimon