Seite 1 von 1

problem mit einem programm

Verfasst: Dienstag 10. Dezember 2013, 20:23
von johannes2007
hallo
ich habe eine frage zu einem Programm das ich aus einem buch hab
könntet ihr vielleicht sagen was das Problem ist und wie ich es beheben kann
(das Programm ist noch nicht fertig aber es sollte funktionieren sagt das buch)

Code: Alles auswählen

from tkinter import *
import random
import time

class Spiel:
    def _init_(self):
        self.tk = Tk()
        self.tk.title("Herr Strichmann rennt zum Ausgang")
        self.tk.resizable(0, 0)
        self.tk.wm_attributes(-"topmost", 1)
        self.canvas = Canvas(self.tk, width=500, height=500, \
                             highlightthickness=0)
        self.canvas.pack()
        self.tk.update()
        self.canvas_height = 500
        self.canvas_width = 500
        self.bg = PhotoImage(file="Hintergrund.gif")
        w = self.bg.width()
        h = self.bg.height()
        for x in range(0, 5):
            for y in range(0, 5):
                self.canvas.create_image(x * w, y * h, \
                                         image=self.bg, anchor='nw')
                                         
        self.sprites = []
        self.rennen = True
    def Hauptschleife(self):
        while 1:
            if self.rennen == True:
                for sprite in self.sprites:
                    sprite.move()
                self.tk.update_idletask()
                self.tk.update()
                time.sleep(0.01)

s = Spiel()
s.Hauptschleife()
das war da Programm
folgende fehlermeldung

Traceback (most recent call last):
File "C:\Strichmännchen\strichmännchen.py", line 37, in <module>
s.Hauptschleife()
File "C:\Strichmännchen\strichmännchen.py", line 29, in Hauptschleife
if self.rennen == True:
AttributeError: 'Spiel' object has no attribute 'rennen'

vielen dank schon mal im vorraus :D :D :)

Re: problem mit einem programm

Verfasst: Dienstag 10. Dezember 2013, 20:28
von BlackJack
@johannes2007: Das Attribut gibt es nicht weil `_init_()` nicht ausgeführt wird und das wird nicht ausgeführt weil es `__init__()` heissen müsste.

Davon mal abgesehen ist das mit `update()` keine gute Idee. Wenn Du eine GUI schreibst, dann lass Dich besser auf ereignisbasierte Programmierung ein, so wie das halt vorgesehen ist, und versuche nicht gewaltsam lineare Programmabläufe da reinzukloppen. Die Hauptschleife stellt Tk.

Re: problem mit einem programm

Verfasst: Mittwoch 11. Dezember 2013, 00:58
von Sirius3
@johannes2007: wenn Du das mit »__init__« repariert hast, wirst Du bei »-"topmost"« hängen bleiben, weil das Negative von Strings gibt es nicht.

Du solltest es vermeiden »from ... import *« zu schreiben. Dadurch müllst Du Dir im Normalfall Deinen Namensraum voll. Du kannst nur schwer nachvollziehen, aus welchem Modul welcher importe Name kommt, es kann zu Namenskonflikten kommen, allein schon, weil vielleicht eine Bibliothek in einer neueren Version vorliegt. Das »Tk«-Objekt innerhalb von »__init__« zu erzeugen, ist bei Ereignisorientierter Programmierung blöd, weil die Event-Schleife ja außerhalb des Spiel-Objekts aufgerufen wird. Die »\« sind an allen Stellen überflüssig und erzeugen nur potentielle Fehlerquellen. Statt »while 1:« schreibt man üblicherweise »while True:«. Auf »True« braucht man nicht explizit testen, es reicht ein »if self.rennen:«.

Re: problem mit einem programm

Verfasst: Mittwoch 11. Dezember 2013, 15:11
von johannes2007
danke

Re: problem mit einem programm

Verfasst: Mittwoch 11. Dezember 2013, 17:39
von N317V
Scheint ja kein besonders gutes Buch zu sein.