Ein Noob hat Probleme :(

Fragen zu Tkinter.
Gast

Ein Noob hat Probleme :(

Beitragvon Gast » Samstag 22. März 2003, 10:48

Hallo! Ich bin ein Schüler und wir nehmen gerade in der Schule Python durch... (nicht gerade einfach wie ich finde :lol: )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 :evil:
BITTE helft mir!
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Samstag 22. März 2003, 11:10

Hi, schön, dass du hier ins Forum kommst :) . Aber bitte beachte zwei Sachen :
  1. 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
  2. ich verschieb dein Topic ins Gui-Forum, da es vor allem um TKinter geht.
Diggä
User
Beiträge: 3
Registriert: Samstag 22. März 2003, 10:29

Beitragvon Diggä » Samstag 22. März 2003, 13:21

nr1

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?)
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Samstag 22. März 2003, 14:49

so... ich hab mir deine Progs mal angeschaut und muss sagen, es sieht gut aus. :D
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... :wink: :roll:
Diggä
User
Beiträge: 3
Registriert: Samstag 22. März 2003, 10:29

Beitragvon Diggä » Samstag 22. März 2003, 16:23

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ä ? :D
das hauptprogramm ist dann wieder logisch aber dieser mittlere teil pff ich habe keine ahnung :cry:

zu nr2 : nun ja da blicke ich gar nicht durch aber es ist auch eher nebensächlich :D :roll: nr 1 ist wichtiger :D .(ich glaube nr 2 gebe ich besser auf wie meine anderen kollegen es auch schon getan haben :) )



mfg
kasimon
User
Beiträge: 18
Registriert: Freitag 21. März 2003, 20:54
Wohnort: Kiel

Beitragvon kasimon » Montag 24. März 2003, 14:38

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:

Code: Alles auswählen

class Tier(Label):
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".

Code: Alles auswählen

  def __init__(self,...):
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.

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)

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.

Code: Alles auswählen

    def gibLaut(self,e):
        pass

    def setName(self,e):
        pass

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
Diggä
User
Beiträge: 3
Registriert: Samstag 22. März 2003, 10:29

Beitragvon Diggä » Montag 24. März 2003, 17:10

vielen dank kasimon! ich habe dank dir nun endlich das programm verstanden juhu :D ü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 ! :D
kasimon
User
Beiträge: 18
Registriert: Freitag 21. März 2003, 20:54
Wohnort: Kiel

Beitragvon kasimon » Dienstag 25. März 2003, 12:34

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]