Hi,
schonmal Vielen Dank - ich habe wieder einiges dazu gelernt.
@maxi_king_333: Die Namen von *Klassen* sollten gross geschrieben werden. `Tkinter` ist doch keine Klasse, sondern ein Modul. Und bei dem `socket`-Beispiel binde ich nicht das Modul `socket` an den Namen `Socket`, sondern die Klasse `socket` *aus* diesem Modul. Interessanterweise heist die Klasse ursprünglich `_socketobject` und wird erst nachträglich an den Namen `socket` gebunden:
Man muss sich erstmal den Unterschied zwischen Funktionen und Modulen klar werden.
Ich denke ich habe es jetzt Verstanden.
Die Komplexität wird *jetzt* noch nicht gebraucht. Auf die Objekte in den Dictionaries wird nicht zugegriffen, also kann man sie auch weglassen.
Und ich versteh's immer noch nicht. Mir ist klar, dass man für verschiedene Ereignisse, die man Melden möchte, jeweils Objekte benötigt, die diese Verarbeiten, den Benutzer informieren, oder auch andere Aktionen auslösen. Aber warum muss man die in diese Dictionaries stecken? Warum mit Zufallszahlen als Schlüssel? Wie soll man da je wieder *gezielt* herankommen? Und wenn man das nicht kann, warum stecken die dann nicht einfach in Listen? Warum willst Du da später noch einmal drauf zugreifen? Gib doch mal bitte ein konkretes Beispiel.
Em also ich möchte da garnicht mehr drauf zugreifen, im Gegenteil - wenn die fertig gelaufen sind soll das Ding ja wieder gelöscht werden.
Darum geht es ja eigentlich - würde das mit Listen gehen - wobei ich muss höchstens 1 Mal drauf zugreifen nämlich wenn ich den Thread starte.
Also gut, ein Beispiel:
Der Nutzer hat folgende Konfiguration:
2 Telefone mit den Nummern 333 444.
Bei einem ausgehenden Anruf über 333: Notify (über Libnotify) "Ausgehender Anruf von 333 zu xxx"; Musik leiser; Wenn die Verbindung steht Musik aus
Bei einem ankommenden Anruf an 333: Notify (über Libnotify) "Ausgehender Anruf von xxx zu 333"; Musik leiser; Wenn die Verbindung steht Musik aus
Bei der Nummer 444 nichts tun.
Die Nummer 333 gehört ihm, die andere einem anderen Familien Mitglied.
Nun wird ein Anruf von 333 getätigt - Die Callmonitor Klasse empfängt das Signal.
Jetzt kommt Parse und wertet es aus - die Notifyer Klasse wird gestartet bzw. es wird ein neues Objekt von ihr erstellt.
Dieses *soll* nun die Konfiguration einlesen (Das macht sie jetzt noch nicht, also von mir aus schreiben wir es eben direkt in den Code) und daraus 3 Notify Objekte erzeugen.
Die Notify Objekte führen jetzt die Oben Genannten Dinge aus.
Und wenn der Anruf Ankommt passiert eben genau das gleiche.
Sollte irgendetwas mit der Nummer 444 an Notifer übergeben werden passiert nichts.
Nur um sicher zu gehen: Du weisst, dass die `Thread`-Objekte solange existieren, bis sie durchgelaufen sind? Auch wenn man keine Referenzen mehr darauf hält. Solange das Hauptprogramm läuft, braucht man sich da nicht mehr weiter zu kümmern. Für das Verhalten wenn das Hauptprogramm endet und noch Threads laufen, ist `Thread.setDaemon()` auf den jeweiligen `Thread`-Exemplaren. verantwortlich.
Ja, jetzt schon.
Aber es wird nicht alles als Thread gestartet - Die Notify Klasse gibt es 2 mal einmal ohne und einmal mit Thread - Wobei ich daraus heute Abend/Nacht ja eh Funktionen mache, die ich dann entweder als Thread oder eben nicht als Thread starte.
Die Frage mit der Klasse habe ich nicht verstanden!? Man kann in Klassen auf alle Namen zugreifen, die auf Modulebene bekannt sind.
Und wie heißt das Modul der Hauptdatei (fbcallnotify.py) - fbcallnotify?
Also theoretisch fbcallnotify.genrandomid()?
Das Problem mit `recv()` ist, dass die Gegenseite 'test\ntest1\n' nicht an einem Stück senden muss, sondern bei Dir auch bei einem `recv()`-Aufruf 'test\nte' und beim nächsten dann erst 'st1\n' ankommen kann. Es ist nicht wirklich garantiert, dass die Zeilen immer an einem Stück ankommen.
Das mit dem `dict()` in `parse.run()` hat einmal den Vorteil, dass `run()` nicht so gross wird und zum zweiten kann man es dann leichter erweitern. Das ist ausserdem die "pythonische" Art eine ``switch``-Anweisung auszudrücken, die es in anderen Programmiersprachen gibt. Ich würde an der Stelle wohl einen dynamischen "dispatch" anhand von ``info[1]`` machen, sofern man davon ausgehen kann, dass für die Fälle, die man behandeln möchte, immer etwas steht, was als Suffix eines gültigen Namens in Python durchgeht. Ungetestet:
http://paste.pocoo.org/show/161268/
Asch so ist das gemeint - dann bau ich eine Schleife ein, die wartet bis nichts mehr kommt.
Viele Grüße
Maxi