Zugriff auf globale Variable

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Bonsai
User
Beiträge: 17
Registriert: Montag 20. August 2012, 10:25

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und mit Performance hat das, entgegen der Aussage des Kommentars, gar nichts zu tun.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Bonsai
User
Beiträge: 17
Registriert: Montag 20. August 2012, 10:25

danke wuf

@Leonidas, meinst du damit, ich soll die mainloop() weiterhin bequem über den Konstruktor starten??
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Leonidas hat geschrieben:Und mit Performance hat das, entgegen der Aussage des Kommentars, gar nichts zu tun.
Habe dich nicht verstanden?

Gruß wuf :wink:
Take it easy Mates!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Bonsai
User
Beiträge: 17
Registriert: Montag 20. August 2012, 10:25

danke für eure Bemühungen!!
Antworten