Neuling sucht Rat

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.
BlackJack

@Tengel: Der Fehler ist der hier:

Code: Alles auswählen

In [1]: None['text'] = 'irgendwas'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/home/bj/<ipython-input-1-3c456552bda6> in <module>()
----> 1 None['text'] = 'irgendwas'

TypeError: 'NoneType' object does not support item assignment
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Hm der Fehler wurde wohl verursacht weil mein __init__ nicht korrekt war.

Das eigentliche Problem scheinen die Schnittstellen zu sein.

Ich starte das Programm - das Gui - sieht aus wie es soll.
Ich nutze den Wert anzeigen Button und es kommt

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "D:\Phyton\lib\tkinter\__init__.py", line 1442, in __call__
    return self.func(*args)
  File "D:/Phyton/trafficklasse/tr.py", line 21, in standAnzeigen
    anzeige["text"] = "Der momentane Verbrauch liegt bei "+str(self.startWert)+" mb."
NameError: global name 'anzeige' is not defined


Muss ich da mit self.anzeige in der Gui Klasse und other.anzeige in der Traffic Klasse arbeiten?
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tengel: die Traffic-Klasse sollte gar nichts mit der »anzeige« zu tun haben.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

hmmmmm

Momentan versuch ich ja über eine Gui Methode eine Traffic Methode aufzurufen - das geht nicht?^^
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tengel: es geht darum, dass GUI-Elemente ausschließlich in der GUI-Klasse verwendet werden sollten, um zum Einen die restlichen Methoden auch ohne GUI benutzen zu können, zum anderen das GUI einfach durch ein anderes austauschen zu können.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

http://pastebin.com/bfMxNUNG

So - die neuste Version.

Ist das mit den Schnittstellen so (halbwegs) richtig?

Das momentane Problem ist:
da ich Gui und Traffic ja getrennt hab - fehlt mir irgendwie die Möglichkeit nach einem Traffic Methoden aufruf - denn Text im Anzeigelabel zu aktualisieren.
Als ich nur mit einer Klasse gearbeitet hab war das ja leicht - einfach in den jeweiligen Methoden anzeige["text"] - und geändert, aber wie mache ich das jetzt?
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

Was fällt Dir auf, wenn Du Deine GUI-Klasse anschaust?
- Keine einzige Methode benutzt »self«, das heißt, sie haben nichts gemeinsam, warum also eine Klasse?
- Jede Methode ist trivial. Ich habe keinen Vorteil davon, dass ein einzelner Button in einer eigenen Method erzeugt wird.
- das Verarbeiten von GUI-Ergeignissen wird nicht in der GUI-Klasse gemacht, sondern in der Traffic-Klasse.

Du benutzt überall globale Variablen, wo sie nicht sein sollten. Zum Beispiel »Traffic.verbrauchSchreiben« tut nicht, was der Name verspricht, sondern greift auf die globale Variable »main« zu, um das Programm zu beenden! :evil:

An Deiner Strukturierung ist so viel falsch, dass es am Besten ist, Du fängst nochmal von vorne an. Als kleine Hilfe hier mal ein Gerüst, das Du mit Leben füllen kannst:

Code: Alles auswählen

import tkinter
 
class Traffic():
    def __init__(self):
        self.start_wert = 0

    def load(self, filename):
        """ Liest den start_wert aus der Datei, und gibt einen Status zurück. """
        # to do ...

    # restliche Methoden 
 
class Gui():
    def __init__(self):
        """ erzeugt ein tkinter-Hauptfenster mit allen Komponenten """
        self.traffic = Traffic()
        self.tk = tkinter.Tk()
        # to do ...

    def mainloop(self):
        self.tk.mainloop()

    # hier kommen die Methoden, die auf Ereignisse reagieren

def main():
    gui = Gui()
    gui.mainloop()

if __name__ == '__main__':
    main()
Du solltest nur etwas in die beiden Klassen schreiben müssen. Auf Modulebene ist das Programmgerüst fertig. Ich habe absichtlich eine Funktion »main« erstellt, damit Du nicht in Versuchung kommst, »gui« irgendwo in Deiner Traffic-Klasse zu benutzen.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Vernichtend :(
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ich glaub es nähert sich dem Punkt wo ichs aufgeb :(
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Wenn du schon dabei bist, dann mach einen neuen Thread auf, dieses Monstrum hat 18 Seiten und mehr als genug Themen berührt.
Antworten