Seite 2 von 2

Re: Zugriff auf globale Variable

Verfasst: Donnerstag 23. August 2012, 16:12
von wuf
Hi Bonsai

Was passiert wenn du die folgenden Modifikationen vornimmst?:

Code: Alles auswählen

self.button = tk.Button(self.fenster, text = "Zug starten", command = self.press)
self.button.pack()
und

Code: Alles auswählen

def press(self):
    print "pressed"
    self.zug.fahren()
Gruß wuf :wink:

Re: Zugriff auf globale Variable

Verfasst: Donnerstag 23. August 2012, 16:18
von Bonsai
wiedermal danke, es waren nur die Anführungszeichen, das wundert mich aber sehr, da ich vor mir ein Handout zum Thema Tkinter-Widgets liegen habe, wo es mit Anführungszeichen erklärt ist :K

Re: Zugriff auf globale Variable

Verfasst: Donnerstag 23. August 2012, 16:37
von wuf
Hi Bonsai

Noch was zur self.fenster.mainloop() Methode. Du startest diese immer noch über den Konstruktor. Nicht mehr direkt aber über eine klasseeigene self.mainloop() Methode. So wie ich deets verstanden habe sollte dies erst geschehen wenn der Konstruktor der Klasse durchlaufen wurde. Das heisst die Klassen 'Spiel' & 'Grafik' müssten wie folgt angepasst werden:

Code: Alles auswählen

#Klasse zur Steuerung des Spiels
class Spiel:
    def __init__(self):
        self.grafik = Grafik(self)
        self.grafik.mainloop()
       
#Klasse zur Abbildung von Objekten auf dem Canvas
class Grafik:
    def __init__(self, spiel):
        self.spiel = spiel

        #Tkinter-Interface
        self.fenster = tk.Tk()
       
        #Erzeugen eines Hintergrundobjekts
        self.hintergrund=Hintergrund()
       
        #Canvas
        self.canvas = tk.Canvas(width=self.hintergrund.width,height=self.hintergrund.height)
        self.canvas.pack()
        print "Canvas created"
       
        #Hintergrund
        self.hintergrund = self.hintergrund.hintergrund
        self.canvas.create_image(0,0,image=self.hintergrund,anchor=tk.NW)
        print "Hintergrund erstellt"

        #Erzeugen eines Zugobjekts
        self.zug = Zug(self)

        #Start-Button
        #self.button = tk.Button(self.fenster, text = "Zug starten", command = "self.press")
        self.button = tk.Button(self.fenster, text = "Zug starten", command = self.press)
        self.button.pack()

        #Gleise
        self.gleise = Gleise(self)
       
        #self.mainloop()
Gruß wuf :wink:

Re: Zugriff auf globale Variable

Verfasst: Donnerstag 23. August 2012, 17:05
von Leonidas
Und mit Performance hat das, entgegen der Aussage des Kommentars, gar nichts zu tun.

Re: Zugriff auf globale Variable

Verfasst: Donnerstag 23. August 2012, 17:23
von Bonsai
danke wuf

@Leonidas, meinst du damit, ich soll die mainloop() weiterhin bequem über den Konstruktor starten??

Re: Zugriff auf globale Variable

Verfasst: Donnerstag 23. August 2012, 17:24
von wuf
Leonidas hat geschrieben:Und mit Performance hat das, entgegen der Aussage des Kommentars, gar nichts zu tun.
Habe dich nicht verstanden?

Gruß wuf :wink:

Re: Zugriff auf globale Variable

Verfasst: Freitag 24. August 2012, 07:05
von Leonidas
Bonsai hat geschrieben:@Leonidas, meinst du damit, ich soll die mainloop() weiterhin bequem über den Konstruktor starten??
Nein, wie kommst du denn darauf. Das sollte man nicht machen und ich Stimme dem entsprechendem Tippgeber da absolut zu.
wuf hat geschrieben:
Leonidas hat geschrieben:Und mit Performance hat das, entgegen der Aussage des Kommentars, gar nichts zu tun.
Habe dich nicht verstanden?
Ich meine damit dass dieser Kommentar:

Code: Alles auswählen

    #Mainloop außerhalb des Konstruktors (Performance)
Der im Quelltext auf der zweiten Seite dieses Threads aufgetaucht ist, falsch ist. Denn das hat gar nichts mit Performance zu tun, ist sogar kaum messbar langsamer. Man sollte keine Klassen schreiben die bei Instanziierung in Dauerschleifen verfallen, das ist einfach schlechter Stil. So wie du es machst ist schon besser, allerdings würde ich Mainloops eigentlich generell nur in der ``def main()`` starten, denn sonst hat man wieder das Problem mit blockierenden Klassen, statt in ``Grafik`` ist es halt in ``Spiel`` nun, effektiv das gleiche Problem, nur verschoben.

Re: Zugriff auf globale Variable

Verfasst: Freitag 24. August 2012, 08:15
von wuf
OK Leonidas

Danke für deine Klarstellung. Bonsai ich habe das Skript einmal nach den neusten Erkenntnisse korrigiert:

Code: Alles auswählen

# -*- coding: cp1252 -*-

import Tkinter as tk  #verwendete GUI: Tkinter

#Klasse zur Steuerung des Spiels
class Spiel:
    def __init__(self):
        self.grafik = Grafik(self)
        
#Klasse zur Abbildung von Objekten auf dem Canvas
class Grafik:
    def __init__(self, spiel):
        self.spiel = spiel
        
        #Tkinter-Interface
        self.fenster = tk.Tk()
       
        #Erzeugen eines Hintergrundobjekts
        self.hintergrund=Hintergrund()
       
        #Canvas
        self.canvas = tk.Canvas(width=self.hintergrund.width,
            height=self.hintergrund.height)
        self.canvas.pack()
        print "Canvas created"
       
        #Hintergrund
        self.hintergrund = self.hintergrund.hintergrund
        self.canvas.create_image(0,0,image=self.hintergrund,anchor=tk.NW)
        print "Hintergrund erstellt"

        #Erzeugen eines Zugobjekts
        self.zug = Zug(self)

        #Start-Button
        self.button = tk.Button(self.fenster, text="Zug starten",
            command=self.press)
        self.button.pack()

        #Gleise
        self.gleise = Gleise(self)

    def mainloop(self):
        self.fenster.mainloop()

    def press(self):
        print "pressed"
        self.zug.fahren()

#Klasse für die Hintergrundobjekte        
class Hintergrund:
    def __init__(self):
        self.hintergrund = tk.PhotoImage(file = "Images/hintergrund2.gif")
        self.width = self.hintergrund.width()
        self.height = self.hintergrund.height()

#Klasse für die am Anfang vorhandenen Gleise
class Gleise:
    def __init__(self, grafik):
        self.grafik = grafik
        self.canvas = self.grafik.canvas
        self.gleise_img = tk.PhotoImage(file="Images/gleis.gif")
        for i in xrange(23):
            self.canvas.create_image(i*20, 169, image=self.gleise_img,
                anchor=tk.NW)
            print "Gleis erstellt bei", i*20, 169

#Klasse für den fahrenden Zug
class Zug:
    def __init__(self, grafik):
        self.grafik = grafik
        self.canvas = self.grafik.canvas
        self.x = 0
        self.y = 138
        self.zug_img = tk.PhotoImage(file = "Images/Zug.gif")
        self.canvas.create_image(self.x,self.y,image=self.zug_img,anchor=tk.NW,
            tags='zugtag')

    def fahren(self):
        self.canvas.move('zugtag',1,0)
        self.x = self.x + 1
        print "Bewegung um 1"
        if self.x < 470:
            self.canvas.after(10, self.fahren)

def main():
    spiel= Spiel()
    spiel.grafik.mainloop()
       
main()  #Starten des Spiels
Gruß wuf :wink:

Re: Zugriff auf globale Variable

Verfasst: Freitag 24. August 2012, 10:07
von Bonsai
danke für eure Bemühungen!!