Seite 1 von 1

Problem mit "Run" in IDLE

Verfasst: Freitag 28. Dezember 2007, 01:06
von LunarEffect
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. =)

Verfasst: Samstag 29. Dezember 2007, 11:55
von LunarEffect
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 =(

Verfasst: Samstag 29. Dezember 2007, 13:11
von gerold
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.

Verfasst: Samstag 29. Dezember 2007, 15:50
von LunarEffect
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

Verfasst: Dienstag 1. Januar 2008, 22:17
von LunarEffect
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!

Verfasst: Dienstag 1. Januar 2008, 22:46
von Leonidas
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.

Verfasst: Mittwoch 2. Januar 2008, 00:26
von BlackJack
Anstelle von `ncurses` kann man `urwid` für Konsolen-UIs nehmen.