Seite 1 von 1

Eventproblem

Verfasst: Sonntag 19. Juni 2005, 12:31
von jAN
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.

Verfasst: Sonntag 19. Juni 2005, 12:46
von Leonidas

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 :(

Verfasst: Sonntag 19. Juni 2005, 13:04
von jAN
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.

Verfasst: Sonntag 19. Juni 2005, 18:52
von mawe
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

Verfasst: Montag 20. Juni 2005, 13:06
von Leonidas
Ich glaub ich schreibe mir mal ein Script in einer Objektorientierten, Perlähnlichen Sprache dafür, wäre sicher eine tolle Übung ;)

Verfasst: Montag 20. Juni 2005, 15:19
von jAN
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

Verfasst: Montag 20. Juni 2005, 15:27
von Leonidas
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)

Verfasst: Montag 20. Juni 2005, 15:38
von mawe
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 :)