Problem mit "Run" in IDLE

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
LunarEffect
User
Beiträge: 5
Registriert: Freitag 28. Dezember 2007, 00:48

Hallo,
Ich habe ein Problem mit einem Programm, dass ich gerade schreibe. Es ist ein eifacher P2P chatclient/server mit threading. Das Problem, dass ich habe, ist, dass ich das Programm nicht aus "Run" von IDLE starten kann, da sich dann der PC aufhängt. Mache ich aber einen doppleclick auf die chatclient.py läuft das Programm ohne probleme (bisher nur über localhost xD). Lasse ich den Debugger aber in IDLE laufen, kommen ein paar seltsame fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python25\lib\idlelib\Debugger.py", line 67, in run
    return self.idb.run(*args)
  File "C:\Python25\lib\bdb.py", line 366, in run
    exec cmd in globals, locals
  File "D:\python\testxD.py", line 50, in <module>
    blaServer().start()
  File "C:\Python25\lib\threading.py", line 394, in __init__
    assert group is None, "group argument must be None for now"
  File "C:\Python25\lib\threading.py", line 394, in __init__
    assert group is None, "group argument must be None for now"
  File "C:\Python25\lib\bdb.py", line 48, in trace_dispatch
    return self.dispatch_line(frame)
  File "C:\Python25\lib\bdb.py", line 66, in dispatch_line
    self.user_line(frame)
  File "C:\Python25\lib\idlelib\Debugger.py", line 21, in user_line
    self.gui.interaction(message, frame)
  File "C:\Python25\lib\idlelib\Debugger.py", line 186, in interaction
    self.show_variables(1)
  File "C:\Python25\lib\idlelib\Debugger.py", line 299, in show_variables
    lv.load_dict(ldict, force, self.pyshell.interp.rpcclt)
  File "C:\Python25\lib\idlelib\Debugger.py", line 455, in load_dict
    svalue = self.repr.repr(value) # repr(value)
  File "C:\Python25\lib\repr.py", line 24, in repr
    return self.repr1(x, self.maxlevel)
  File "C:\Python25\lib\repr.py", line 34, in repr1
    s = __builtin__.repr(x)
  File "C:\Python25\lib\threading.py", line 416, in __repr__
    assert self.__initialized, "Thread.__init__() was not called"
AssertionError: Thread.__init__() was not called
Hier zur Referenz noch der Programmcode:

Code: Alles auswählen

import threading
from socket import *
import time

#----------------SERVER CLASS----------------
class blaServer ( threading.Thread ):

   def run ( self ):
      host = "localhost"
      port = 33333
      buff = 512
      addr = (host,port)
      ServerSocket = socket(AF_INET,SOCK_DGRAM)
      ServerSocket.bind(addr)
      print "Server started"
      while 1:
          data,addr = ServerSocket.recvfrom(buff)
          if data:
             print data
             if data.endswith("Stop Now"):
                ServerSocket.close()
                print "Server shut down"
                time.sleep(1)
                break
               
#----------------CLIENT CLASS----------------
class blaClient ( threading.Thread ):

   def run ( self ):
       name = "LunarEffect"
       host = "localhost"
       port = 33333
       buff = 512
       addr = (host,port)
       ClientSocket = socket(AF_INET,SOCK_DGRAM)
       print "Client started"
       print "Connection to", host, "on port", port
       while (1):
           data = raw_input()
           if data:
              data = name+" says: "+data
              ClientSocket.sendto(data,addr)
              if data.endswith("Stop Now"):
                 ClientSocket.close()
                 print 'Client shut down'
                 time.sleep(1)
                 break

#----------------MAIN XD----------------
blaServer().start()
time.sleep(0.1)
blaClient().start()
Ich wäre über jegliche Hilfe sehr dankbar. =)
LunarEffect
User
Beiträge: 5
Registriert: Freitag 28. Dezember 2007, 00:48

Hmm, wahrscheinlich hat es was mit dem

Code: Alles auswählen

AssertionError: Thread.__init__() was not called
zu tun...aber was damit habe ich keine Ahnung =(
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo LunarEffect!

Ich dachte, dass dir darauf sicher jemand antwortet, weil das immer wieder mal hier im Python-Forum Thema ist. Dann erledige ich das mal:

Wenn irgendetwas im Idle nicht funktioniert, was in einer anderen IDE oder direkt aufgerufen funktioniert, dann ist meistens Idle daran schuld. Nimm in diesem Fall eine andere IDE.

mfg
Gerold
:-)

PS: Vermeide doch bitte Sternimporte.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
LunarEffect
User
Beiträge: 5
Registriert: Freitag 28. Dezember 2007, 00:48

Vielen dank für die Antwort, Gerold, ich weiß es sehr zu schätzen! =)

Das mit den Stern Importen werde ich mir merken, danke für den Tip!

Schönen Tag noch!

LunarEffect
LunarEffect
User
Beiträge: 5
Registriert: Freitag 28. Dezember 2007, 00:48

Sooo, noch ne Frage xD

Dieses Programm funktioniert sehr gut, aber einen Fehler hat es, dass mich irgendwie irritiert. Wenn ich mit jemandem drüber chatte, und diese Person mir etwas schreibt, wenn ich gerade tippe, gibt es mir die Nachricht des gegenübers irgendwo an der entsprechenden stelle der eingabe aus. Die übertragenen Daten sind aber (offensichtlich) die Richtigen, es ist jediglich ein ästhetisches Problem.

Das Fenster sieht dann ungefähr so aus:

Hallo, wi[Chatpartners Nachticht]Heute ist ein toller Tag[Chatpartners Nachricht ende] e geht es dir?

Die offensichtlichste Lösung wäre es auf einer Graphischen Oberfläche zu Programmieren, aber ich wollte fragen, ob das auch irgendwie in der Konsole zu lösen ist. =)

Vielen dank im Voraus!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

LunarEffect hat geschrieben:Die offensichtlichste Lösung wäre es auf einer Graphischen Oberfläche zu Programmieren, aber ich wollte fragen, ob das auch irgendwie in der Konsole zu lösen ist. =)
Ja, mit ncurses geht sowas - aber ncurses hat IMHO eines grausamsten APIs die es gibt, daher nutzt das unter Python auch kaum jemand.

Eine Idee wäre es vielleicht, die von dir eingetippten Sachen zu löschen, dann erst die Antwort des Chatpartners anzuzeigen und dann das was du eingetippt hast wieder einzugügen - ist aber vergleichsweise aufwendig.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Anstelle von `ncurses` kann man `urwid` für Konsolen-UIs nehmen.
Antworten