Anfängerfrage: Prob mit Tkinter(Entry)

Fragen zu Tkinter.
Antworten
lost_mind
User
Beiträge: 82
Registriert: Dienstag 13. Februar 2007, 11:55

Hi an das Forum :)
Ich habe ein prob und zwar wie bekomme ich mit get() den inhalt von einem Entry feld?

mit get(name des widgets) und name des widgets.get() bekomm ich nur nen error ?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Laut Docs auf http://www.pythonware.com/library/tkint ... ethods.htm ist der Zugriff mit deineEntryWidgetInstanz.get() soweit richtig. Lass doch mal verlauten, um welche Fehlermeldung es sich handelt, dann kann dir eher geholfen werden ;)
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

such doch mal im Tkinterunterforum!
Dort ist dein Problem des Öfteren besprochen worden.
lost_mind
User
Beiträge: 82
Registriert: Dienstag 13. Februar 2007, 11:55

ok werd mal im tkinter forum schaun :) noch ne frage kann es vieleicht sein weil ich die gui extern mit exec lade ? also ich hab zwei file das programm und die gui
BlackJack

Das kann sein. Solche Kleinigkeiten solltest Du vielleicht erwähnen.
lost_mind
User
Beiträge: 82
Registriert: Dienstag 13. Februar 2007, 11:55

ok habs probiert mit den gui code in einem file aber geht trotzdem nicht :( sry aber ich kann den fehler nicht posten bin nicht mit meinem rechner im netz aber ich poste den code wenn wer lust hat ihn sich anzuschauen und zu helfen thx :D
ach ja der code ist noch ziemlich alpha :) und nicht zu streng ist mein erstes prog


Code: Alles auswählen

import pickle
from Tkinter import *

class Finanzen(object):
  def __init__(self, dateiname):
      self.dateiname = dateiname
      try:
          f = file (self.dateiname, 'r')
          self.ausgaben, self.einahmen, self.geldstand, self.kontoAktualisierungen = pickle.load(f)
          f.close()
      except:
             self.ausgaben = []
             self.einahmen = []
             self.geldstand = [0.0]
             self.kontoAktualisierungen = []

  def speichern(self):
      #Listen speichern
      f = file (self.dateiname, 'w')
      pickle.dump((self.ausgaben, self.einahmen, self.geldstand, self.kontoAktualisierungen), f)
      f.close()

  def kontoAB(self, betrag, datum, verwendungszweck):
      #uebernimmt ausgaben in den stand
      self.ausgaben.append([betrag, datum, verwendungszweck, monat])
      self.geldstand[0] -= betrag
      return self.geldstand, u'\u20ac'

  def kontoZU(self, betrag, datum, von):
      #uebernimmt einahmen in den stand
      self.einahmen.append([betrag, datum, von])
      self.geldstand[0] += betrag
      return self.geldstand, u'\u20ac'

  def kontoAKT(self):
      #aktualisert den kontostand
      betrag = kontostand.get()
      self.geldstand[0] = betrag
      #self.kontoAktualisierungen.append([betrag, datum])
      #return "Geldstand aktualisiert auf", betrag

#  def ausgabenSTAT(self, Monat):
#      return [betrag for betrag in self.ausgaben if betrag[3] == Monat]

  def getmonat(self, monat):
      if monat == '01':
          m = u'J\u04D3nner'
      elif monat == '02':
          m = 'Februar'
      elif monat == '03':
          m = u'M\u04D3rz'
      elif monat == '04':
          m = 'April'
      elif monat == '05':
          m = 'Mai'
      elif monat == '06':
          m = 'Juni'
      elif monat == '07':
          m = 'Juli'
      elif monat == '08':
          m = 'August'
      elif monat == '09':
          m = 'September'
      elif monat == '10':
          m = 'Oktober'
      elif monat == '11':
          m = 'November'
      elif monat == '12':
          m = 'Dezember'
      else: raise NameError, "monatsname konnte nicht ermittelt werden(funktion getmonat)"

f = Finanzen('konto.st')
gui = file('gui.py', 'r')
#exec gui

root = Tk(className='finanz kalkulator')
#Anzeige des Aktuelen Geldstandes
kontoausgabe = Label(root, text=f.geldstand[0], anchor=NW).grid(row=0, column=1)
textgeldstand = Label(root, text='Gelstand:').grid(row=0, column=0)

#Aktualisieren des Geldstandes
kontostand = Entry(root).grid(row=1, column=0)
kontoAKTbut = Button(root, text='Aktualisieren', command=f.kontoAKT).grid(row=1, column=1)

root.mainloop()
BlackJack

Mit einheitlicher Einrückung hast Du's irgendwie nicht so, oder? Da gibt's von den meisten Editoren gute Unterstützung mittels Tabulatortaste. Vorher nicht vergessen in den Einstellungen vier echte Leerzeichen pro Tab-Druck einzustellen.

Ein paar Zeilen sind länger als 80 Zeichen. Sternchen-Importe sollte man unterlassen.

Bei ``except`` sollte man immer eine konkrete Ausnahme angeben, sonst wird dort alles behandelt, was eventuell wichtige Fehlermeldungen verschluckt, so dass man Fehler nur sehr schwer finden kann.

Die Namen der Methoden entsprechen nicht dem Style Guide -- kleine_buchstaben_mit_unterstrichen.

Pickle-Dateien müssen als Binärdateien geöffnet werden, sonst können sie unter anderen Betriebssystemen eventuell nicht mehr gelesen werden.

Warum wird der `geldstand` in einer Liste gespeichert die immer nur aus diesem einen Element besteht? Warum geben `kontoAB` und `kontoZU` ein Tupel zurück mit dem Eurozeichen als konstantes zweites Element?

in `kontoAB()` wird der Name `monat` benutzt, woher kommt der? Und würde diese Information nicht auch schon im übergebenen `datum` stecken?

`Finanzen.getmonat()` benutzt das Objekt gar nicht, könnte also eine Funktion sein, und macht mit dem Namen `m` am Ende überhaupt nichts. Die Funktion könnte man sehr einfach durch ein Dictionary ersetzen, das die "Zahlen" auf Monatsnamen abbildet.

Wenn man das Hauptprogramm in eine Funktion steckt, die nur ausgeführt wird wenn das Modul als Programm gestartet wurde, dann lässt es sich im Interpreter als Modul importieren und man kann die einzelnen Komponenten ausprobieren.

Und nun zum Problem:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.4/lib-tk/Tkinter.py", line 1345, in __call__
    return self.func(*args)
  File "forum.py", line 37, in kontoAKT
    betrag = kontostand.get()
AttributeError: 'NoneType' object has no attribute 'get'
Offensichtlich ist `kontostand` an dieser Stelle `None`. Schauen wir mal wo und wie der Name an ein Objekt gebunden wird:

Code: Alles auswählen

kontostand = Entry(root).grid(row=1, column=0)
Wenn man danach ein ``print kontostand`` einfügt wird ``None`` ausgegeben. Und zwar weil die `grid()`-Methode `None` zurückgibt. Du musst das also in zwei Schritte aufspalten, wenn das `Entry`-Objekt an den Namen `kontostand` gebunden werden soll.

Code: Alles auswählen

kontostand = Entry(root)
kontostand.grid(row=1, column=0)
Was Du da mit ``exec`` versuchst kann ich nur ahnen, aber das ist sicher etwas, das besser mit ``import`` gelöst wird.
lost_mind
User
Beiträge: 82
Registriert: Dienstag 13. Februar 2007, 11:55

das mit exept ist doch nur fürs laden der datei ? oder ist das nur ein allgemeiner hinweis ?

das mit den namen habe gefixt

wie öffne ich pickle dateien binär und arbeiten dan mit ihnen ?

der geldstand ist nicht mehr in einer liste ist gefixt

konto ab ist auch geändert uund gefixt

die funktione ist schon weg

ok danke jetzt geht es :)

und das mit exec funktioniert :) aber wie sollte ich das mit import lösen ?
das mit exec ist nur weil ich das prog und die gui trennen wollte also in 2 files

hier die neue version des programms: http://paste.pocoo.org/show/1016/
die gui : http://paste.pocoo.org/show/1017/

ich hab noch ein prob bei der gui funktioniert

Code: Alles auswählen

root.wm_iconbitmap('icon.ico')

nicht auf linux aber beim win system geht es ich bekomme bei linux die fehler meldung :

Code: Alles auswählen

Traceback (most recent call last):
  File "finanz_helper_v0.6a.py", line 91, in ?
    exec gui
  File "gui.py", line 3, in ?
    root.wm_iconbitmap( 'icon.ico')
  File "/usr/lib/python2.4/lib-tk/Tkinter.py", line 1448, in wm_iconbitmap
    return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
_tkinter.TclError: bitmap "icon.ico" not defined 
schonmal danke an die helfer :)
BlackJack

Das mit ``except`` ist ein allgemeiner Hinweis, da sollte immer eine, oder mehrere, konkrete Ausnahme stehen, sonst wird dort *jede* Ausnahme behandelt, die innerhalb des Blocks direkt, oder indirekt in einer aufgerufenen Funktion oder Methode, auftritt.

Dateien öffnet man im Binärmodus, indem man an das `mode`-Argument ein 'b' anhängt, also 'rb' und 'wb' zum Lesen und Schreiben.

Du hast die Programmlogik und die GUI aber nicht wirklich getrennt. Keines von beidem kann man ohne das andere benutzen. Du hast nur den Quelltext für ein Modul auf zwei Dateien verteilt, anstatt zwei Module zu schreiben.

Normalerweise ist die GUI das Hauptprogramm, also die Datei, die der Anwender startet. Dort importierst Du das Modul mit der `Finanzen`-Klasse und erzeugst *dort* ein Exemplar eines `Finanzen`-Objekts. Angenommen die Datei heisst `Finanzen.py`, dann sollte folgendes am Anfang von `gui.py` reichen:

Code: Alles auswählen

from Finanzen import Finanzen

f = Finanzen('konto')
Ist natürlich nicht so schön den ganzen Code auf Modulebene zu haben, aber das sollte erst einmal funktionieren.
lost_mind
User
Beiträge: 82
Registriert: Dienstag 13. Februar 2007, 11:55

damit ich es mit from Finanzen import finanzen importieren kann muss es aber in das python site-packages verzeichnis oder ?
hm das mit der gui stimmt ^^ das werd ich ändern oder umschreiben aber das kommt erst später, erst kommt noch eine statistik funktion ect.^:)
was für möglichkeiten gibt es noch auser alles auf modul eben zu haben ?
BlackJack

Nein es muss sich irgendwo in `sys.path` befinden. Da ist auch das aktuelle Verzeichnis enthalten. Wenn also beide Dateien im selben Verzeichnis liegen, dann geht es auch.
lost_mind
User
Beiträge: 82
Registriert: Dienstag 13. Februar 2007, 11:55

btw. wie ist der code für mein erstes prog bis jetzt ?
hm das mit der gui mach ich vieleicht doch nicht so getrennt das man beides ohne das andere geht es war eigentlich nur für mich den coder gedacht ^^

ich glaube die frage ist untergegangen also hol ich sie nochmal :)
ich hab noch ein prob bei der gui funktioniert

Code: Alles auswählen

root.wm_iconbitmap('icon.ico')

nicht auf linux aber beim win system geht es ich bekomme bei linux die fehler meldung :

Code: Alles auswählen

Traceback (most recent call last):
  File "finanz_helper_v0.6a.py", line 91, in ?
    exec gui
  File "gui.py", line 3, in ?
    root.wm_iconbitmap( 'icon.ico')
  File "/usr/lib/python2.4/lib-tk/Tkinter.py", line 1448, in wm_iconbitmap
    return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
_tkinter.TclError: bitmap "icon.ico" not defined 
kan es sein das es etwas mit dem X-window server zu tun hat den das icon ist nicht das tk sonder das von X?
Antworten