Eigener IRC Client hat Probleme...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Akyth0n
User
Beiträge: 3
Registriert: Montag 30. September 2013, 14:14

Hallo,
wir machen für die Schule unseren eigenen IRC Chat Clienten und haben bereits ein halbwegs funktionierendes Programm (mit Tkinter) gemacht.
Code an der Problemstelle:

Code: Alles auswählen

while True:
		data = irc_connect.recv(4096)	
		if len(data) != 0:
			irc_chat.insert(END, data + "\n")	
			irc_chat.place(x=20, y=50)
irc_chat ist ein Textfeld.
Dadurch dass es eine Endlosschleife ist,schreibt diese nichts in das Textfeld, bis man ein KeyboardInterrupt macht in der Shell ...
Wie kann man das Textfeld sozusagen "live" updaten lassen??

Wenn nötig schicke ich den gesamten Code.

MFG,
Akyth0n
Zuletzt geändert von Anonymous am Montag 30. September 2013, 14:32, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Akyth0n: Du kannst in GUI-Programmen nicht auf diese Weise lang laufenden Code haben. Die GUI muss die meiste Zeit über die Kontrolle haben und die ruft Deinen Code auf wenn bestimmte Ereignisse eintreten. Dein Code darf dann nur kurz etwas tun und muss dann wieder zur GUI-Hauptschleife zurückkehren, sonst kann die GUI nicht aktualisiert werden und auf den Benutzer reagieren.

Wenn Du nebenher etwas machen willst, dann muss das entweder so programmiert sein, dass man eine Funktion oder Methode hat die immer nur ein kleines Stück der Gesamtaufgabe erledigt und regelmässig von der GUI-Hauptschleife aufgerufen wird. In `Tkinter` macht man das mit Hilfe der `after()`-Methode die es auf jedem Widget gibt. Oder man muss den länger laufenden Code in einem eigenen Thread laufen lassen, der mit dem Hauptthread in dem die GUI läuft über `Queue.Queue`-Objekte kommuniziert. Der Hauptthread prüft regelmässig mit Hilfe von `after()` auf Daten vom Thread.

Der `place()`-Aufruf sieht sehr eigenartig aus an der Stelle, wobei man `place()` sowieso nicht verwenden sollte. Man überlässt das platzieren der Widgets einem Layout-Manager, damit das nicht nur auf dem eigenen Rechner funktioniert, oder solchen die sehr ähnliche Displaygrösse und Grafikeinstellungen verwenden.

Letztlich würde ich von der GUI erst einmal abraten und das für die Konsole machen. Das ist auch komplex genug, und man könnte sich erst einmal darauf konzentrieren das IRC-Protokoll korrekt zu implementieren. Dein Code ist nämlich fehlerhaft, weil der im Grunde überhaupt kein Protokoll berücksichtigt, sondern einfach beliebige Datenstücke von dem TCP-Datenstrom liest und mit einem zusätzlichen Zeilenende ausgibt.
Akyth0n
User
Beiträge: 3
Registriert: Montag 30. September 2013, 14:14

Okay Danke. Bin jetzt http://effbot.org/zone/tkinter-threads.htm hierauf gestoßen damit parallel zur GUI die Serververbindung läuft. Aber das Prinzip dahinter verstehe ich nicht ganz wie ich das auf meinen Code anwenden kann...
Akyth0n
User
Beiträge: 3
Registriert: Montag 30. September 2013, 14:14

Gut. Mittlerweile habe ich den Code so umgeschrieben, dass die Anfrage an der Server in einem neuen Thread stattfindet, und lasse mit einer StringVar den Code updaten. Das führt leider wieder zu einer Fehlermerldung....
Neues Ziel ist jetzt erstmal eine Queue zu nutzen. Danke für die Hilfe und die Tipps.
PS: Es wird wohl bei einer GUI bleiben, ist einfach übersichtlicher...
Antworten