kleine Problemhilfe

Fragen zu Tkinter.
Antworten
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Wie sicher schon der eine oder andere bemerkt hat versuche ich gerade mit mehr oder weniger erfolgreichen Versuchen Python zu lernen. Dazu benutze ich ein Buch welches mir bislang auch gut geholfen hat! Am Ende eines jeden Kapitels kann man dann Aufgaben lösen, wobei die Lösungen gleich im Anschluss folgen. Ich habe es also selber versucht die Aufgabe zu lösen, nicht geschafft und danach die Lösung fleißig abgetippt.
Doch selbst diese Lösung läuft bei mir nicht:

Code: Alles auswählen

# Schiffeversenken.pyw
from Tkinter import *
from random import *
class Feld (object):

    def __init__(self,spiel,x,y):
        self.x = x
        self.y = y
        self.spiel = spiel
        self.button = button(self.spiel.fenster,
                           text='  ',command=self.press)
        self.button.grid(column=x, row=y)

    def press(self):
        check = self.spiel.spielfeld.checkTreffer
        if check(self.x, self.y):
            self.button.config(bg='blue')
        else: self.buttom.config(bg='white')

class Spielfeld (object):
    def __init__(self):
        self.d = {}
        for i in range(12):
          for j in range (12):
             self.d[(i,j)]=0
        for i in range(4): self.setzeBoot(1)
        for i in range(3): self.setzeBoot(2)
        for i in range(2): self.setzeBoot(3)
        self.setzeBoot(4)

    def setzeBoot(self, laenge):
        max = 11 - laenge
        ok=0
        while not ok:
            if choice[(0,1)]:
                y = randint(1,10)
                x = randint(1,max)
                if self.check(x, y, x+laenge-1, y):
                    for x in range(x, x+laenge):
                        self.d[(x, y)] = 1
                    ok=1
            else:
                x = randint(1,10)
                y = randint(1,max)
                if self.check(x, y, x, y+laenge-1):
                    for y in range(y, y+laenge):
                        self.d[(x, y)] = 1
                    ok = 1

    def check(self, x1, y1, x2, y2):
        ok = 1
        for x in range(x1-1,x2+2):
            for y in range(y1-1,y2+2):
                if self.d[x,y]: ok= 0
        return ok

    def checkTreffer(self, x, y):
        return self.d[x,y]
        
class Schiffeversenken (object):
    def __init__ (self):
        self.fenster = Tk()
        self.spielfeld = Spielfeld()
        for x in range(12):
            for y in range(12):
                button=Feld(self, x, y)
        self.fenster.mainloop()
spiel = Schiffeversenken()
Ich habe NATÜRLICH mindestens 10 mal alles auf genauste auf Schreibfehler überprüft aber konnte am Ende keine mehr finden.
Kann mir vieleicht BITTE einer sagen wo mein Fehler sein kann?

Danke schonmal an alle die sich die Mühe machen mir zu helfen.

Edit (birkenfeld): code-Tag auf python gestellt.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Was funktioniert denn nicht? Fehlermeldung?
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Die Fehlermeldung hilft mir da jedoch auch nicht weiter...

Traceback (most recent call last):
File "C:/Dokumente und Einstellungen/Bob/Desktop/PythonScripts/schiffeversenken.pyw", line 68, in <module>
spiel = Schiffeversenken()
File "C:/Dokumente und Einstellungen/Bob/Desktop/PythonScripts/schiffeversenken.pyw", line 63, in __init__
self.spielfeld = Spielfeld()
File "C:/Dokumente und Einstellungen/Bob/Desktop/PythonScripts/schiffeversenken.pyw", line 26, in __init__
for i in range(4): self.setzeBoot(1)
File "C:/Dokumente und Einstellungen/Bob/Desktop/PythonScripts/schiffeversenken.pyw", line 35, in setzeBoot
if choice[(0,1)]:
TypeError: 'instancemethod' object is unsubscriptable
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Boby666666 hat geschrieben:Die Fehlermeldung hilft mir da jedoch auch nicht weiter...
Uns aber schon!

Sie sagt schonmal, dass der Fehler in Zeile 35 liegt. "...is unsubscriptable" sagt aus, dass du eckige Klammern an unpassender Stelle benutzt. Eckige Klammern benutzt man, um auf die Eintraege einer Liste zuzugreifen. Du hast in Zeile 35 stehen: choice[...]. Choice ist aber keine Liste, sondern eine Funktion und wird somit mit runden Klammern aufgerufen.

PS: Und was ist das fuer ein Buch, das dort *-Imorte benutzt werden? Boese, boese!
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Rebecca hat geschrieben: PS: Und was ist das fuer ein Buch, das dort *-Imorte benutzt werden? Boese, boese!
Das Buch heißt: Objektorientiert Programmierung mit Python

Es ist sehr hilfreich für Einsteiger, besonders wenn man bedenkt das ich gelernter Koch bin ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Boby666666 hat geschrieben:Edit (birkenfeld): code-Tag auf python gestellt.
:D
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Rebecca hat geschrieben:Sie sagt schonmal, dass der Fehler in Zeile 35 liegt. "...is unsubscriptable" sagt aus, dass du eckige Klammern an unpassender Stelle benutzt. Eckige Klammern benutzt man, um auf die Eintraege einer Liste zuzugreifen. Du hast in Zeile 35 stehen: choice[...]. Choice ist aber keine Liste, sondern eine Funktion und wird somit mit runden Klammern aufgerufen.
So ausgetauscht... nun kommt dann folgendes:

Traceback (most recent call last):
File "C:/Dokumente und Einstellungen/Bob/Desktop/PythonScripts/schiffeversenken.pyw", line 68, in <module>
spiel = Schiffeversenken()
File "C:/Dokumente und Einstellungen/Bob/Desktop/PythonScripts/schiffeversenken.pyw", line 66, in __init__
button=Feld(self, x, y)
File "C:/Dokumente und Einstellungen/Bob/Desktop/PythonScripts/schiffeversenken.pyw", line 10, in __init__
self.button = button(self.spiel.fenster,
NameError: global name 'button' is not defined
BlackJack

Was wohl daran liegen könnte das der globale Name `button` nicht definiert ist. Die Vermutung liegt nahe das `Button` gemeint ist.
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Ja OK! Das klingt einleuchtend, aber warum in Gottes Namen steht denn in dieser Lösung die def Button nicht mit drinn verdammt...
Ich bin doch noch garnicht so weit das ich mir das selber zusammen reimen kann ;(

Also doch keine empfehlenswertes Buch!
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Boby666666 hat geschrieben:aber warum in Gottes Namen steht denn in dieser Lösung die def Button nicht mit drinn verdammt...
Weil Button aus dem Tkinter-Modul kommt. Das ist eben ein Nachteil von *-importen: Man sieht nicht, was woher kommt. Da ist Tkinter.Button(...) doch viel klarer!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Boby666666 hat geschrieben:Ja OK! Das klingt einleuchtend, aber warum in Gottes Namen steht denn in dieser Lösung die def Button nicht mit drinn verdammt...
Weil der Name "Button" aus dem Modul "Tkinter" kommt. Da siehst du dann auch gleich mal, was passiert wenn man *-Importe nutzt.
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

EyDu hat geschrieben: Weil der Name "Button" aus dem Modul "Tkinter" kommt. Da siehst du dann auch gleich mal, was passiert wenn man *-Importe nutzt.
Auch das ist sehr einleuchtend, ABER ich habe doch wie gesagt die Lösung nur abgetippt.
Da kann ich also nicht direkt was dafür! Ich würde jetzt nur gerne mal ne Lösung haben damit ich dann an dem Teil weiter machen kann oder ein wenig rumprobieren... doch das geht nicht wenn mir keiner sagt was ich denn anders machen muss..

Also bitte nicht weiter kritisieren ohne gleich ne Lösung für das Problem mit zu liefern... Ich weiß doch das ich ein blutiger Anfänger bin.

Wenn ich jetzt in Tkinter den Button direkt anspreche kommt folgendes:

Traceback (most recent call last):
File "C:/Dokumente und Einstellungen/Bob/Desktop/PythonScripts/schiffeversenken.pyw", line 84, in <module>
spiel = Schiffeversenken()
File "C:/Dokumente und Einstellungen/Bob/Desktop/PythonScripts/schiffeversenken.pyw", line 78, in __init__
self.fenster = Tk()
NameError: global name 'Tk' is not defined



EDIT: Kann es sein das irgend etwas mit dem Modul nicht stimmt?
Kann es sein das ich das nicht habe, oder vieleicht nicht da habe wo es sein müsste?
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hallo Boby,
http://paste.pocoo.org/show/1476/

Gruss
pyStyler
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

pyStyler hat geschrieben:Hallo Boby,
http://paste.pocoo.org/show/1476/

Gruss
pyStyler
Extrem geil!!!

Wo war mein fehler?

Code: Alles auswählen

if choice(auswahl):
Das wars???
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Boby666666 hat geschrieben:Da kann ich also nicht direkt was dafür! Ich würde jetzt nur gerne mal ne Lösung haben damit ich dann an dem Teil weiter machen kann oder ein wenig rumprobieren... doch das geht nicht wenn mir keiner sagt was ich denn anders machen muss..
BlackJack hatte doch schon den Fehler bzw. die Loesung dazu gesagt. Ich wollte dich auch nicht kritisieren, ich weiss ja, dass das Programm nicht von dir ist. Ich wollte dir nur helfen, in Zukunft besser zu programmieren als der Autor des Buches. :wink:
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Rebecca hat geschrieben: BlackJack hatte doch schon den Fehler bzw. die Loesung dazu gesagt. Ich wollte dich auch nicht kritisieren, ich weiss ja, dass das Programm nicht von dir ist. Ich wollte dir nur helfen, in Zukunft besser zu programmieren als der Autor des Buches. :wink:
Das finde ich auch sehr nett von dir. Aber seine Lösung hatte mir ja nicht wirklich weiter geholfen.
Trotzdem Danke!
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Boby666666 hat geschrieben:
pyStyler hat geschrieben:Hallo Boby,
http://paste.pocoo.org/show/1476/

Gruss
pyStyler
Extrem geil!!!

Wo war mein fehler?

Code: Alles auswählen

if choice(auswahl):
Das wars???
ja
Boby666666
User
Beiträge: 57
Registriert: Montag 8. Januar 2007, 10:53
Kontaktdaten:

Unglaublich!
Und ich dachte da es schon die 3. Auflage des Buches ist, daß dort keine Fehler mehr drin sein dürften. Aber das erklärt dann auch war frühere Versuche andere Scripte nicht gefunzt haben.

Mal was leicht am Thema vorbei.
Gibt es eigentlich irgend wo ne Website in der man "offene" Scripte bekommt an denen man rumbasteln kann bis der arzt kommt?

Also so zu sagen ein Scriptpool...
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Du musst nur suchen. Wenn du was bestimmtes suchst, findet man meistens was. Wenn du überhaupt Scripte suchst, kannst du hier anfangen. Unter Showcase gibts bestimmt zum ein oder anderen Thema manch lehrreiches Script. Anderer seits ist "rumbasteln bis der Arzt kommt" vlt. nicht die beste Lernmethode. Nach ein paar Tests, die du dir selbst zusammenbasteln können müsstest, solltest du lieber versuchen, leichte Programme selbst zu schreiben. Wenn du dazu ein Buch ließt, kannst du all das einbauen, was du schon kannst, und das, was du noch nicht kannst als Anlass nehmen, es zu lernen. :wink:
Gruß, jj
Antworten