NameError

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
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Der folgende Fehler:

Code: Alles auswählen

raceback (most recent call last):
  File "tk-import-gui_oo.py", line 8, in ?
    class  tk_gui:
  File "tk-import-gui_oo.py", line 27, in tk_gui
    for zeile, lst in enumerate(konto.get_konto_liste() ):
NameError: name 'konto' is not defined
tritt auf, wenn ich diesen Code ausführe:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-


import konto_core_004
import Tix

class  tk_gui:
   def  __init__(self):
      konto = konto_core_004.Konto()

   def lade():
      konto.add_to_konto_liste(k.konto_liste, k.import_csv("test.csv"))

   def loesche():
      konto.loesche_konto()


   def ok_command():
      print "ok"


   root = Tix.Tk()
   win = Tix.ScrolledWindow(root, scrollbar='auto',height=500)
   win.pack(fill=Tix.X, expand=1)

   for zeile, lst in enumerate(konto.get_konto_liste() ):
      zeile2 = zeile +1
      # Farbe wegen negativer Zahl
      if lst[9] < 0:
         fg_color = "red"
      else: fg_color = None #"blue"
      # Hintergrund jeder 2. Zeile weiss
      if zeile % 2: bg_color = "white"
      else: bg_color = None

      for spalte, element in enumerate(lst[:7]):
         Tix.Label(win.window, text=element, bd=1, relief="ridge",
            anchor=Tix.N+Tix.W,justify=Tix.LEFT, fg=fg_color, background=bg_color
            ).grid(row=zeile2, column=spalte, sticky=Tix.E+Tix.W+Tix.N+Tix.S)


   box = Tix.ButtonBox(root, orientation=Tix.HORIZONTAL, bg="blue", padx=0, pady=0,height=200)
   box.add('import', text='Importiere Kontoauszug', underline=0,
      command=lambda root=root: lade(), bg="green")
   box.add('del', text='loesche Konto', underline=0,
      command=lambda root=root: ok_command(), relief="flat", bg="red")
   box.add('cancel', text='Programm beenden', underline=0,
      command=lambda root=root: ok_command())
   box.pack(side=Tix.BOTTOM, fill=Tix.X)

   root.mainloop()

if __name__ == '__main__':
   gui = tk_gui()
konto_core_004 ist eine von mir geschriebene Klasse.
Jetzt möchte ich auch gerne meine kleine GUI als Klasse schreiben, steige aber erst gerade in das Thema ein und weiß nicht was ich falsch mache.

cu Sebastian
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

hmmm ... ja ... was ist "konto"? - ist es eine globale Variable, so kann es nicht schaden, sie auch als solche anzulegen :) ... ist es ein class-member, würde ich alle aufrufe von "konto" durch "self.konto" ersetzen .. (und btw: lade, loesche und ok_command könnten mal noch "self" als argument vertragen)

außerdem würde ich alles, was in der klasse tk_gui rumschwirrt UND NICHT zu einer funktion gehört, in die __init__ mit reinschreiben (wenn ich das richtig in erinnerung hab, wird das zu erst ausgeführt - und denn die aufgerufene funktion. das würde den fehler erklären: du greifst erst drauf zu und anschließend wird erst __init__ aufgerufen und konto initialisiert)

und wenn wir schon dabei sind: was ist "k" (Zeile 13)?
Inter Deum Et Diabolum Est!
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Außerdem sieht mir das nach einem Einrückungsfehler aus (Zeile 23)...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

@Necoro
hmm, da habe ich ja nicht nur ein wenig übersehen.
Danke deine Tipps bringen mich weiter, werde mich direkt mal dransetzen.

edit: k ist eine Schlamperei von mir und stammt noch aus dem Prototypen

@ jens
Das soll ja alles in die Klasse rein und kommt nun wie Necoro geschrieben hat mit in den __init__ Block.

Danke für eure Hilfe
cu Sebastian
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Ich muss mich wirklich noch an den Umgang mit den Namensbereichen gewöhnen. Aber genau dazu ist dieses Projakt ja auch gedacht ;-)

Muss noch etwas basteln, damit ich die Funktionen über die Knöpfe aufrufen kann aber das Ganze startet schon mal so wie es soll.

Hier die aktuelle Version:

Code: Alles auswählen

import konto_core_004
import Tix

class  tk_gui:
   def  __init__(self):
      konto = konto_core_004.Konto()

      root = Tix.Tk()
      swin = Tix.ScrolledWindow(root, scrollbar='auto',height=500)
      swin.pack(fill=Tix.X, expand=1)

      self.draw_table(swin, konto.get_konto_liste())

      box = Tix.ButtonBox(root, orientation=Tix.HORIZONTAL, bg="blue", padx=0, pady=0,height=200)
      box.add('import', text='Importiere Kontoauszug', underline=0,
         command=lambda root=root: self.lade(), bg="green")
      box.add('del', text='loesche Konto', underline=0,
         command=lambda root=root: self.ok_command(), relief="flat", bg="red")
      box.add('cancel', text='Programm beenden', underline=0,
         command=lambda root=root: self.ok_command())
      box.pack(side=Tix.BOTTOM, fill=Tix.X)

      root.mainloop()



   def lade(self):
      # open / import a new file
      konto.add_to_konto_liste(konto.konto_liste, konto.import_csv("test.csv"))
      # redraw table
      # draw_table(widget, konto_liste)

   def loesche(self):
      konto.loesche_konto()

   def ok_command(self):
      print "ok"

   def draw_table(self, widget, konto_liste):
      for zeile, lst in enumerate(konto_liste):
         zeile2 = zeile +1
         # Farbe wegen negativer Zahl
         if lst[9] < 0: fg_color = "red"
         else: fg_color = None
         # Hintergrund jeder 2. Zeile weiss
         if zeile % 2: bg_color = "white"
         else: bg_color = None

         for spalte, element in enumerate(lst[:7]):
            Tix.Label(widget.window, text=element, bd=1, relief="ridge",
               anchor=Tix.N+Tix.W,justify=Tix.LEFT, fg=fg_color, background=bg_color
               ).grid(row=zeile2, column=spalte, sticky=Tix.E+Tix.W+Tix.N+Tix.S)

if __name__ == '__main__':
   gui = tk_gui()
Antworten