Eventproblem

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.
Antworten
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

hier mal der Quelltext:

Code: Alles auswählen

from Tkinter import *
class Spielfeld:
    def __init__(self,master,Hoehe,Breite):
        self.oben=['w','Up']
        self.unten=['s','Down']
        self.rechts=['d','Right']
        self.links=['a','Left']
        self.breite=Breite
        self.hoehe=Hoehe
        self.master=master
        self.farbe='white'
        self.aktivfarbe='red'
        self.fram=Frame(self.master)
        self.dict={}
        self.fram.bind_all('<Any-KeyPress>',self.Steuerung)
        self.pos=1
        self.linksliste=range(1,self.breite*self.hoehe+1,self.breite)
        self.rechtsliste=range(self.breite,self.breite*self.hoehe+1,self.breite)
    def Richtung(self,event):
        return self.event.keysym
    def Feld(self):
        anz=self.hoehe*self.breite
        row=1
        column=1
        for i in range(1,anz+1):
            if column%(self.breite+1)==0:
                column=1
                row+=1
            if i==1:
                lab=Label(self.fram,bg=self.aktivfarbe,width=4,height=2,relief='ridge').grid(row=row,column=column)    
            else:lab=Label(self.fram,bg=self.farbe,width=4,height=2,relief='ridge').grid(row=row,column=column)
            column+=1
            self.dict[i]=lab
        return self.fram
    def aktualisieren(self):
        for i in range(1,self.breite*self.hoehe+1):
            self.dict[i].config(bg=self.farbe)
        self.dict[self.pos].config(bg=self.aktivfarbe)
    def Steuerung(self,event):
        richtung=self.Richtung(self)
        if richtung in self.oben+self.unten+self.rechts+self.links:
            if richtung in self.oben and self.pos > self.breite:
                self.pos-=self.breite
            if richtung in self.unten and self.pos < (self.breite*self.hoehe)-self.breite:
                self.pos+=self.breite
            if richtung in self.rechts and self.pos not in self.rechtsliste:
                self.pos+=1
            if richtung in self.links and self.pos not in self.linksliste:
                self.pos-=1
            aktualisieren()
if __name__=='__main__':
    root=Tk()
    a=Spielfeld(root,10,10)
    a.Feld().pack()
    mainloop()
    
das ist mein erster versuch was objektorientiertes mit Python zu Programmieren
das Problem:
ich bekomme folgende Fehlermeldung
Exception in Tkinter callback
Traceback (most recent call last):
File "D:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
return self.func(*args)
File "T:\classpos.py", line 40, in Steuerung
richtung=self.Richtung(self)
File "T:\classpos.py", line 20, in Richtung
return self.event.keysym
AttributeError: Spielfeld instance has no attribute 'event'
kann mir vielleicht einer helfen, wie ich das Problem beheben kann??

Danke schonmal im Voraus

Gruß jAN :cry:

Edit (Leonidas): Code im Python-Tags gestellt und verschoben.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 

from Tkinter import *

class Spielfeld:
    
    def __init__(self, master, Hoehe, Breite):
        self.oben = ['w','Up']
        self.unten = ['s','Down']
        self.rechts = ['d','Right']
        self.links = ['a','Left']
        self.breite = Breite
        self.hoehe = Hoehe
        self.master = master
        self.farbe = 'white'
        self.aktivfarbe = 'red'
        self.fram = Frame(self.master)
        self.dict = {}
        self.fram.bind_all('<Any-KeyPress>', self.Steuerung)
        self.pos = 1
        self.linksliste = range(1, self.breite * self.hoehe + 1, self.breite)
        self.rechtsliste = range(self.breite, self.breite * self.hoehe + 1, self.breite)
        
    def Richtung(self, event):
        return event.keysym
        
    def Feld(self):
        anz = self.hoehe * self.breite
        row = 1
        column = 1
        for i in range(1, anz + 1):
            if column % (self.breite + 1) == 0:
                column = 1
                row += 1
            if i == 1:
                lab = Label(self.fram, bg=self.aktivfarbe, width=4, height=2, relief='ridge').grid(row=row, column=column)
            else:
                lab = Label(self.fram, bg=self.farbe, width=4, height=2, relief='ridge').grid(row=row, column=column)
            column += 1
            self.dict[i] = lab
        return self.fram
        
    def aktualisieren(self):
        for i in range(1, self.breite * self.hoehe + 1):
            self.dict[i].config(bg = self.farbe)
        self.dict[self.pos].config(bg=self.aktivfarbe)
        
    def Steuerung(self, event):
        richtung = self.Richtung(event)
        if richtung in self.oben + self.unten + self.rechts + self.links:
            if richtung in self.oben and self.pos > self.breite:
                self.pos -= self.breite
            if richtung in self.unten and self.pos < (self.breite * self.hoehe) - self.breite:
                self.pos += self.breite
            if richtung in self.rechts and self.pos not in self.rechtsliste:
                self.pos += 1
            if richtung in self.links and self.pos not in self.linksliste:
                self.pos -= 1
            self.aktualisieren()
            
if __name__=='__main__':
    root = Tk()
    a = Spielfeld(root, 10, 10)
    a.Feld().pack()
    mainloop()
Bei dir hatte event kein Keysm, weil es auch kein event war, sondern eine Instanz von Spielfeld.

Offene Frage: Warum hassen die meisten Tkinter Programmierer Leerzeichen? Ich bin praktisch die ganze Zeit beschäftigt bei Tkinter-Programmen die Leerzeichen zwischen den Operatoren einzufügen und in Funktionsaufrufen nach dem ',' auch noch jeweils ein Leerzeichen reinzuschreiben :(
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

ich hab ne andere lösung gefunden!

Code: Alles auswählen

from Tkinter import *
class Spielfeld:
    def __init__(self, master, Hoehe, Breite):
        self.oben = ['w', 'Up']
        self.unten = ['s', 'Down']
        self.rechts = ['d', 'Right']
        self.links = ['a', 'Left']
        self.breite = Breite
        self.hoehe = Hoehe
        self.master = master
        self.farbe = 'white'
        self.aktivfarbe = 'red'
        self.fram = Frame(self.master)
        self.dict = {}
        self.fram.bind_all('<Any-KeyPress>', self.Steuerung)
        self.pos = 1
        self.linksliste = range(1, self.breite*self.hoehe+1, self.breite)
        self.rechtsliste = range(self.breite, self.breite*self.hoehe+1, self.breite)
    def Feld(self):
        anz = self.hoehe*self.breite
        row = 1
        column = 1
        for i in range(1, anz+1):
            if i == 1:
                lab = Label(self.fram, bg=self.aktivfarbe, width=4, height=2, relief='ridge')
            else:
                lab = Label(self.fram, bg=self.farbe, width=4, height=2, relief='ridge')
            self.dict[i] = lab
            if column % (self.breite+1) == 0:
                column = 1
                row+=1
            self.dict[i].grid(row=row, column=column)    
            column+=1
            self.dict[i] = lab
        print self.dict
        return self.fram
    def aktualisieren(self):
        for i in range(1, self.breite*self.hoehe+1):
            self.dict[i].config(bg=self.farbe)
        self.dict[self.pos].config(bg=self.aktivfarbe)
    def Steuerung(self, event):
        richtung = event.keysym
        if richtung in self.oben+self.unten+self.rechts+self.links:
            if richtung in self.oben and self.pos > self.breite:
                self.pos-=self.breite
            if richtung in self.unten and self.pos < (self.breite*self.hoehe)-self.breite:
                self.pos+=self.breite
            if richtung in self.rechts and self.pos not in self.rechtsliste:
                self.pos+=1
            if richtung in self.links and self.pos not in self.linksliste:
                self.pos-=1
            self.aktualisieren()
if __name__=='__main__':
    root=Tk()
    Spielfeld(root, 10 ,10).Feld().pack()
    mainloop()
    
ps:
hab noch ein paar leerzeichen reingebastelt für leonidas :P

Edit (Leonidas): Code in Python-Tags gesetzt.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!
Leonidas hat geschrieben: Warum hassen die meisten Tkinter Programmierer Leerzeichen?
Gute Frage, jetzt wo Du's sagst fällt mir das auch auf ... ich glaube ich gehöre auch zu den Übeltätern. Irgendwie witzig ... :)

Gruß, mawe
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich glaub ich schreibe mir mal ein Script in einer Objektorientierten, Perlähnlichen Sprache dafür, wäre sicher eine tolle Übung ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Viel spass dabei

ps: könntest du auch mal in python versuchen!
bekommst du bestimmt besser hin als ich
und hier nochmal meine neuste version:

Code: Alles auswählen

# -*- coding: cp1252 -*-
from Tkinter import *
from random import randint
class Spielfeld:
    def __init__(self, master, Hoehe, Breite, bot, botfunc):
        self.bot=bot
        if self.bot:self.botrichtung=botfunc
        self.kastx=4
        self.kasty=2
        self.bot2=1
        self.oben = ['w', 'Up']
        self.unten = ['s', 'Down']
        self.rechts = ['d', 'Right']
        self.links = ['a', 'Left']
        self.breite = Breite
        self.hoehe = Hoehe
        self.master = master
        self.farbe = 'white'
        self.aktivfarbe = 'red'
        self.fram = Frame(self.master)
        self.dict = {}
        self.fram.bind_all('<Any-KeyPress>', self.Steuerung)
        self.leeren=1
        self.pos = 1
        self.punkte=StringVar(self.fram)
        self.punkte.set('0')
        self.relief='ridge'
        self.botfarbe='green'
        self.ueberdeckfarbe='blue'
        self.botpos=self.hoehe*self.breite
        self.bot2pos=self.breite
        self.randfelder=range(1,self.breite)+range(self.breite+1,self.breite*self.hoehe,self.breite)+range(self.breite,self.breite*self.hoehe,self.breite)+range(self.breite*self.hoehe-self.breite,self.breite*self.hoehe+1)
        self.linksliste = range(1, self.breite*self.hoehe+1, self.breite)
        self.rechtsliste = range(self.breite, self.breite*self.hoehe+1, self.breite)
    def Feld(self):
        anz = self.hoehe*self.breite
        row = 1
        column = 1
        for i in range(1, anz+1):
            if i == 1:
                lab = Label(self.fram, bg=self.aktivfarbe, width=self.kastx, height=self.kasty, relief=self.relief)
            else:
                lab = Label(self.fram, bg=self.farbe, width=self.kastx, height=self.kasty, relief=self.relief)
            if self.bot and i==self.botpos:
                lab = Label(self.fram, bg=self.botfarbe, width=self.kastx, height=self.kasty, relief=self.relief)
            self.dict[i] = lab
            if column % (self.breite+1) == 0:
                column = 1
                row+=1
            self.dict[i].grid(row=row, column=column)    
            column+=1
            self.dict[i] = lab
            self.label=Label(self.fram,textvariable=self.punkte).grid(row=self.hoehe+1,column=1,columnspan=self.breite)
        return self.fram
    def aktualisieren(self):
        if self.leeren:
            for i in range(1, self.breite*self.hoehe+1):
                self.dict[i].config(bg=self.farbe)
        self.dict[self.pos].config(bg=self.aktivfarbe)
        if self.bot:            
            self.dict[self.botpos].config(bg=self.botfarbe)
            if self.pos==self.botpos:
                self.dict[self.pos].config(bg=self.ueberdeckfarbe)
                self.botpos=self.randfelder[randint(0,(2*self.breite+2*self.hoehe)-4)]
                self.punkte.set(str(int(self.punkte.get())+1))
        if self.bot2:            
            self.dict[self.bot2pos].config(bg=self.botfarbe)
            if self.pos==self.bot2pos:
                self.dict[self.pos].config(bg=self.ueberdeckfarbe)
                self.bot2pos=self.randfelder[randint(0,(2*self.breite+2*self.hoehe)-4)]
                self.punkte.set(str(int(self.punkte.get())+1))
    def Steuerung(self, event):
        if self.bot:
            botrichtung = self.botrichtung()
            if botrichtung in ['w','a','s','d']:
                if botrichtung =='w' and self.botpos > self.breite:
                    self.botpos-=self.breite
                if botrichtung =='s' and self.botpos < (self.breite*self.hoehe)-self.breite:
                    self.botpos+=self.breite
                if botrichtung =='d' and self.botpos not in self.rechtsliste:
                    self.botpos+=1
                if botrichtung =='a' and self.botpos not in self.linksliste:
                    self.botpos-=1
                self.aktualisieren()
        if self.bot2:
            botrichtung = self.botrichtung()
            if botrichtung in ['w','a','s','d']:
                if botrichtung =='w' and self.bot2pos > self.breite:
                    self.bot2pos-=self.breite
                if botrichtung =='s' and self.bot2pos < (self.breite*self.hoehe)-self.breite:
                    self.bot2pos+=self.breite
                if botrichtung =='d' and self.bot2pos not in self.rechtsliste:
                    self.bot2pos+=1
                if botrichtung =='a' and self.bot2pos not in self.linksliste:
                    self.bot2pos-=1
                self.aktualisieren()
        richtung = event.keysym
        if richtung in self.oben+self.unten+self.rechts+self.links:
            if richtung in self.oben and self.pos > self.breite:
                self.pos-=self.breite
            if richtung in self.unten and self.pos < (self.breite*self.hoehe)-self.breite+1:
                self.pos+=self.breite
            if richtung in self.rechts and self.pos not in self.rechtsliste:
                self.pos+=1
            if richtung in self.links and self.pos not in self.linksliste:
                self.pos-=1
            self.aktualisieren()
        
        
if __name__=='__main__':
    from whrandom import *
    def botrichtung():
        return ['w','s','a','d'][randint(0,3)]
    
    root=Tk()
    hoehe=Entry(root)
    hoehe.insert(0,'Hoehe')
    hoehe.pack()
    breite=Entry(root)
    breite.insert(0,'Breite')
    breite.pack()
    def ok(event=None):
        feld=Toplevel(root)
        a=Spielfeld(feld, int(hoehe.get()) ,int(breite.get()) , 1, botrichtung)
        a.kastx=2
        a.kasty=1
        a.Feld().pack()
    root.bind('<Return>',ok)
    
    mainloop()
    
viel spass
gruß jAN

EDIT by mawe: Code in python-tags gesetzt
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jAN hat geschrieben:Viel spass dabei

ps: könntest du auch mal in python versuchen!
Könnte ich, aber Python kann ich schon, da ist ja gar kein Lerneffekt mehr dabei :!:
jAN hat geschrieben:EDIT by mawe: Code in python-tags gesetzt
Hey mawe, das hab ich vor 2 Sekunden schon editiert 8)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

So, jetzt muss ich aber auch mal meckern:
jAN, in Deinem Code kommt eine Zeile vor, die sage und schreibe 222 (!) Zeichen lang ist. *aaargh* Man kann in Python sehr einfach Zeilen umbrechen, das sieht doch dann auch gleich viel übersichtlicher aus ;)
Leonidas hat geschrieben: Hey mawe, das hab ich vor 2 Sekunden schon editiert
:D Das kommt davon, wenn sich 2 (über)eifrige Moderatoren gleichzeitig im selben Forum herumtummeln :)
Antworten