Chat

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
campino97
User
Beiträge: 42
Registriert: Freitag 3. September 2010, 20:11

hallo Community,
ich habe mich in den letzten Wochen mal ein bisschen hingesetzt und habe ein kleines Chat programm geschrieben.
Nun möchte ich von euch wissen wie ihr es findet, was ihr verbessern würdet und auch wenn ihr es schon wisst wie man es verbessern könnte.
Ihr braucht nur das modul pygame

Hier ist schonmal der code

alle drei dateien müssen in einen ordner und evtl muss in dem ersten Programm auch in zeile 73 der Pfad der datei angegeben sein.

das chatprogramm selber das ihr nennen könnt wie ihr wollt:

Code: Alles auswählen

# -*- coding: utf-8 -*-
class Chat:
    def __init__(self):
        from ftplib import FTP
        from cStringIO import StringIO
        import time
        self.ftp=FTP(server)
        self.ftp.connect()
        self.ftp.login(benutzer,passwort)
        self.ftp.cwd(server_pfad)
        self.ftp1=FTP(server)
        self.ftp1.connect()
        self.ftp1.login(benutzer,passwort)
        self.ftp1.cwd(server_pfad)
    def chat_download(self,server,benutzer,passwort,server_pfad,server_datei):
        from cStringIO import StringIO
        datei= StringIO()
        index=0
        nachricht=""
        print "Bereit..."
        while True:
            datei= StringIO()
            print "Empfange..."
            self.ftp.retrbinary("RETR "+server_datei,datei.write)
            print "Angekommen..."
            if nachricht == datei.getvalue():
                pass
            elif nachricht != datei.getvalue():
                global nachrichten_text
                nachrichten_text = datei.getvalue()
                set_bildschirm()
                set_schrift()
                nachricht= datei.getvalue()
            time.sleep(4)
        datei.close()
    def chat_upload(self,server,benutzer,passwort,server_pfad,server_datei,string):
        from cStringIO import StringIO
        nachricht=""
        datei2 = StringIO()
        self.ftp1.retrbinary("RETR "+server_datei,datei2.write)
        nachricht = datei2.getvalue()
        nachricht += string+"\n"
        datei= StringIO(nachricht)
        self.ftp1.storbinary("Stor "+server_datei,datei)#Server Datei
        datei.close()
        datei= StringIO()
        set_bildschirm()
        set_schrift()
        for i in range(9):
            datei= StringIO()
            self.ftp.retrbinary("RETR "+server_datei,datei.write)
        global nachrichten_text
        nachrichten_text = datei.getvalue()
        set_bildschirm()
        set_schrift()
        datei.close
        print "Gesendet"
    def chat_leeren(self,server,benutzer,passwort,server_pfad,server_datei):
        from cStringIO import StringIO
        nachricht = ""
        datei= StringIO(nachricht)
        self.ftp1.storbinary("Stor "+server_datei,datei)#Server Datei
        datei.close()
        set_bildschirm()
        set_schrift()
        datei= StringIO()
        self.ftp.retrbinary("RETR "+server_datei,datei.write)
        global nachrichten_text
        nachrichten_text = datei.getvalue()
import pygame,sys,random,thread
from pygame_eingabe import event2zeichen
#-----------------------------------Erstellt Einstellungen Variablen---------------------------------------------------------------------------------------------------
einstellungen_datei = open("Einstellungen","r")
einstellungen_string = einstellungen_datei.read()
exec einstellungen_string
#vordergrund_farbe = [100,0,255]
#hintergrund_farbe = [0,0,0]
#schriftgroesse = 20
nick = raw_input("Nick: ")
#-----------------------------------Erstellt Server Variablen----------------------------------------------------------------------------------------------------------
#server = "rstestdomain.rs.funpic.de"
#benutzer = "ftp1778310"
#passwort = "anonym555"
#server_pfad = "/"
#server_datei = "chat_datei"
#-----------------------------------Erstellt Pygame Definitionen-------------------------------------------------------------------------------------------------------
def set_bildschirm():
    screen.fill(hintergrund_farbe)
    chat_rect = pygame.Rect(10,20,230,250)
    eingabe_rect = pygame.Rect(10,290,230,100)
    pygame.draw.rect(screen,vordergrund_farbe,chat_rect,1)
    pygame.draw.rect(screen,vordergrund_farbe,eingabe_rect,1)
    pygame.display.flip()
def set_schrift():
    eingabe_liste_vollstandig = eingabetext.split('\n')
    eingabe_liste = eingabe_liste_vollstandig[-28:]
    zeilen_index = 0
    for i in eingabe_liste:
        eingabe_pytext = font.render(i,1,schrift_farbe)
        zahl = zeilen_index*13+292
        zeilen_index += 1
        screen.blit(eingabe_pytext,(12,zahl))
    pygame.display.flip()
    nachrichten_liste_vollstandig = nachrichten_text.split('\n')
    nachrichten_liste = nachrichten_liste_vollstandig[-20:]
    zeilen_index = 0
    for i in nachrichten_liste:
        nachricht_pytext = font.render(i,1,schrift_farbe)
        zahl = zeilen_index*13+22
        zeilen_index += 1
        screen.blit(nachricht_pytext,(12,zahl))
    pygame.display.flip()

#-----------------------------------Erstellt Variablen-----------------------------------------------------------------------------------------------------------------
eingabetext = "[%s] "% nick
nickzahl = 0
for i in eingabetext:
    nickzahl += 1
shift = 0
buchstabenzahl = 0 + nickzahl
zeilenzahl = 0
nachrichten_text = ""
#-----------------------------------Erstellt Pygamefenster und bereitet es vor-----------------------------------------------------------------------------------------
pygame.init()
screen = pygame.display.set_mode([250,420])
font = pygame.font.Font(None, schriftgroesse)
set_bildschirm()
set_schrift()
#-----------------------------------Beginn der While-Schleife----------------------------------------------------------------------------------------------------------
chat = Chat()
import time
print "Bereit..."
thread.start_new_thread(chat.chat_download,(server,benutzer,passwort,server_pfad,server_datei))
time.sleep(3)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LSHIFT or event.key == pygame.K_RSHIFT:
                if shift == 1:
                    shift = 0
                elif shift == 0:
                    shift = 1

            if event.key == 301:    #Feststelltaste
                shift = 2

            eingabe = event2zeichen(event,shift)
            if eingabe == "ENTFERNE_LETZTES_ELEMENT!":
                if buchstabenzahl == nickzahl:
                    continue
                eingabetext=eingabetext[:-1]
                if buchstabenzahl > 0:
                    buchstabenzahl -= 1
                elif buchstabe == 0:
                    #zeilenzahl -= 1
                    buchstabenzahl = 27
            elif eingabe == "ENTER!":
                if eingabetext == "[%s] ./leeren"% nick:
                    eingabetext = "[%s] "% nick
                    buchstabenzahl = 0 + nickzahl
                    chat.chat_leeren(server,benutzer,passwort,server_pfad,server_datei)
                elif eingabetext != "["+nick+"] "+"/leeren":
                    chat.chat_upload(server,benutzer,passwort,server_pfad,server_datei,eingabetext)
                    eingabetext = "["+nick+"] "
                    buchstabenzahl = 0 + nickzahl
            elif eingabe != "ENTFERNE_LETZTES_ELEMENT!" and eingabe != "" and eingabe != "ENTER!":
                eingabetext += eingabe
                buchstabenzahl += 1
                buchstabe = ""
                index = 0
                if buchstabenzahl == 28:
                    try:
                        while buchstabe != ' ':
                            index -= 1
                            buchstabe = eingabetext[index]
                        buchstabe[index] = "\n"
                        buchstabenzahl = 0
                    except:
                        eingabetext += "\n"
                        zeile = 0
                        buchstabenzahl = 0

            if event.key != pygame.K_LSHIFT and event.key != pygame.K_RSHIFT and shift == 1:
                shift = 0

            set_bildschirm()
            set_schrift()


        if event.type == pygame.KEYUP:
            if event.key == 301:    #Feststelltaste
                shift = 0






dann ein benötigtes Modul, welches ihr pygame_eingabe.py nennen müsst:

Code: Alles auswählen

# -*- coding: utf-8 -*-
import pygame

def event2zeichen(event,shift):
    eingabetext=""
    if shift == 2:
        shift = 1
    if event.type == pygame.KEYDOWN:
##################################################################################################
#------------------------------Buchstaben & Space------------------------------------------------#
##################################################################################################
        if event.key == pygame.K_LSHIFT or event.key == pygame.K_RSHIFT:
            if shift == 1:
                shift = 0
            elif shift == 0:
                shift=1
        if event.key == pygame.K_a:
            if shift == 1:
                eingabetext += "A"
                shift = 0
            elif shift == 0:
                eingabetext += "a"
        if event.key == pygame.K_b:
            if shift == 1:
                eingabetext += "B"
                shift = 0
            elif shift == 0:
               eingabetext += "b"
        if event.key == pygame.K_c:
            if shift == 1:
                eingabetext += "C"
                shift = 0
            elif shift == 0:
                eingabetext += "c"
        if event.key == pygame.K_d:
            if shift == 1:
                eingabetext += "D"
                shift = 0
            elif shift == 0:
                eingabetext += "d"
        if event.key == pygame.K_e:
            if shift == 1:
                eingabetext += "E"
                shift = 0
            elif shift == 0:
                eingabetext += "e"
        if event.key == pygame.K_f:
            if shift == 1:
                eingabetext += "F"
                shift = 0
            elif shift == 0:
                eingabetext += "f"
        if event.key == pygame.K_g:
            if shift == 1:
                eingabetext += "G"
                shift = 0
            elif shift == 0:
                eingabetext += "g"
        if event.key == pygame.K_h:
            if shift == 1:
                eingabetext += "H"
                shift = 0
            elif shift == 0:
                eingabetext += "h"
        if event.key == pygame.K_i:
            if shift == 1:
                eingabetext += "I"
                shift = 0
            elif shift == 0:
                eingabetext += "i"
        if event.key == pygame.K_j:
            if shift == 1:
                eingabetext += "J"
                shift = 0
            elif shift == 0:
                eingabetext += "j"
        if event.key == pygame.K_k:
            if shift == 1:
                eingabetext += "K"
                shift = 0
            elif shift == 0:
                eingabetext += "k"
        if event.key == pygame.K_l:
            if shift == 1:
                eingabetext += "L"
                shift = 0
            elif shift == 0:
                eingabetext += "l"
        if event.key == pygame.K_m:
            if shift == 1:
                eingabetext += "M"
                shift = 0
            elif shift == 0:
                eingabetext += "m"
        if event.key == pygame.K_n:
            if shift == 1:
                eingabetext += "N"
                shift = 0
            elif shift == 0:
                eingabetext += "n"
        if event.key == pygame.K_o:
            if shift == 1:
                eingabetext += "O"
                shift = 0
            elif shift == 0:
                eingabetext += "o"
        if event.key == pygame.K_p:
            if shift == 1:
                eingabetext += "P"
                shift = 0
            elif shift == 0:
                eingabetext += "p"
        if event.key == pygame.K_q:
            if shift == 1:
                eingabetext += "Q"
                shift = 0
            elif shift == 0:
                eingabetext += "q"
        if event.key == pygame.K_r:
            if shift == 1:
                eingabetext += "R"
                shift = 0
            elif shift == 0:
                eingabetext += "r"
        if event.key == pygame.K_s:
            if shift == 1:
                eingabetext += "S"
                shift = 0
            elif shift == 0:
                eingabetext += "s"
        if event.key == pygame.K_t:
            if shift == 1:
                eingabetext += "T"
                shift = 0
            elif shift == 0:
                eingabetext += "t"
        if event.key == pygame.K_u:
            if shift == 1:
                eingabetext += "U"
                shift = 0
            elif shift == 0:
                eingabetext += "u"
        if event.key == pygame.K_v:
            if shift == 1:
                eingabetext += "V"
                shift = 0
            elif shift == 0:
                eingabetext += "v"
        if event.key == pygame.K_w:
            if shift == 1:
                eingabetext += "W"
                shift = 0
            elif shift == 0:
                eingabetext += "w"
        if event.key == pygame.K_x:
            if shift == 1:
                eingabetext += "X"
                shift = 0
            elif shift == 0:
                eingabetext += "x"
        if event.key == pygame.K_y:
            if shift == 1:
                eingabetext += "Y"
                shift = 0
            elif shift == 0:
                eingabetext += "y"
        if event.key == pygame.K_z:
            if shift == 1:
                eingabetext += "Z"
                shift = 0
            elif shift == 0:
                eingabetext += "z"
        if event.key == pygame.K_SPACE:
            if shift == 1:
                eingabetext += " "
                shift = 0
            elif shift == 0:
                eingabetext += " "
        if event.key == pygame.K_BACKSPACE:
            if shift == 1:
                eingabetext += "ENTFERNE_LETZTES_ELEMENT!"
                shift = 0
            elif shift == 0:
                eingabetext += "ENTFERNE_LETZTES_ELEMENT!"
        if event.key == pygame.K_RETURN:
            if shift == 1:
                eingabetext += "ENTER!"
                shift = 0
            elif shift == 0:
                eingabetext += "ENTER!"

##################################################################################################
#-----------------------Zahlen und Sonderzeichen-------------------------------------------------#
##################################################################################################

        if event.key == pygame.K_1:
            if shift == 1:
                eingabetext += "!"
                shift = 0
            elif shift == 0:
                eingabetext += "1"
        if event.key == pygame.K_2:
            if shift == 1:
                eingabetext += '"'
                shift = 0
            elif shift == 0:
                eingabetext += '2'
        if event.key == pygame.K_3:
            if shift == 1:
                eingabetext += "§"
                shift = 0
            elif shift == 0:
                eingabetext += "3"
        if event.key == pygame.K_4:
            if shift == 1:
                eingabetext += "$"
                shift = 0
            elif shift == 0:
                eingabetext += "4"
        if event.key == pygame.K_5:
            if shift == 1:
                eingabetext += "%"
                shift = 0
            elif shift == 0:
                eingabetext += "5"
        if event.key == pygame.K_6:
            if shift == 1:
                eingabetext += "&"
                shift = 0
            elif shift == 0:
                eingabetext += "6"
        if event.key == pygame.K_7:
            if shift == 1:
                eingabetext += "/"
                shift = 0
            elif shift == 0:
                eingabetext += "7"
        if event.key == pygame.K_8:
            if shift == 1:
                eingabetext += "("
                shift = 0
            elif shift == 0:
                eingabetext += "8"
        if event.key == pygame.K_9:
            if shift == 1:
                eingabetext += ")"
                shift = 0
            elif shift == 0:
                eingabetext += "9"
        if event.key == pygame.K_0:
            if shift == 1:
                eingabetext += "="
                shift = 0
            elif shift == 0:
                eingabetext += "0"
        if event.key == 46:
            if shift == 1:
                eingabetext += ":"
                shift = 0
            elif shift == 0:
                eingabetext += "."
        if event.key == 257:
            if shift == 1:
                eingabetext += "1"
                shift = 0
            elif shift == 0:
                eingabetext += "1"
        if event.key == 258:
            if shift == 1:
                eingabetext += "2"
                shift = 0
            elif shift == 0:
                eingabetext += "2"
        if event.key == 259:
            if shift == 1:
                eingabetext += "3"
                shift = 0
            elif shift == 0:
                eingabetext += "3"
        if event.key == 260:
            if shift == 1:
                eingabetext += "4"
                shift = 0
            elif shift == 0:
                eingabetext += "4"
        if event.key == 261:
            if shift == 1:
                eingabetext += "5"
                shift = 0
            elif shift == 0:
                eingabetext += "5"
        if event.key == 262:
            if shift == 1:
                eingabetext += "6"
                shift = 0
            elif shift == 0:
                eingabetext += "6"
        if event.key == 263:
            if shift == 1:
                eingabetext += "7"
                shift = 0
            elif shift == 0:
                eingabetext += "7"
        if event.key == 264:
            if shift == 1:
                eingabetext += "8"
                shift = 0
            elif shift == 0:
                eingabetext += "8"
        if event.key == 265:
            if shift == 1:
                eingabetext += "9"
                shift = 0
            elif shift == 0:
                eingabetext += "9"
        if event.key == 256:
            if shift == 1:
                eingabetext += "0"
                shift = 0
            elif shift == 0:
                eingabetext += "0"
        if event.key == 45:
            if shift == 1:
                eingabetext += "_"
                shift = 0
            elif shift == 0:
                eingabetext += "-"
        if event.key == 35:
            if shift == 1:
                eingabetext += "'"
                shift = 0
            elif shift == 0:
                eingabetext += "#"
        if event.key == 43:
            if shift == 1:
                eingabetext += "*"
                shift = 0
            elif shift == 0:
                eingabetext += "+"


    return eingabetext



und noch eine Einstellungen datei die ihr Einstellungen nennen müsst:

Code: Alles auswählen

vordergrund_farbe = [255,255,255]
schrift_farbe = [255,0,0]
hintergrund_farbe = [0,0,0]
schriftgroesse = 20
server = "rstestdomain.rs.funpic.de"
benutzer = "ftp1778310"
passwort = "anonym555"
server_pfad = "/"
server_datei = "chat_datei"
ich habe schon einen ftp server in den Einstellungen angegeben
ihr könnt ihn natürlich auch ändern wenn ihr einen eigenen habt



ok schonmal danke für eure Verbesserungsvorschläge und gefundene Fehler!!!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Ehrlich gesagt ist es bei deinem Code recht schwer etwas zu finden, was gut ist. Ich führe mal einige Dinge auf, dabei habe ich mit Sicherheit aber einiges übersehen:

- Chat sollte von object erben
- Importe sollten am Anfang des Moduls stehen und nicht in den Funktionen/Methoden
- Übergib Werte als Parameter an deine Funktionen und nicht mittels global. Wenn du global benutzt, dann machst du mit Sicherheit etwas falsch
- "ftp1" ist ein äußerst schlechter Name
- Schaue dir PEP 8 an
- Benutze das with-Statement
- Sehe ich das richtig, dass der Chat über Dateien läuft?!
- Das ist vollkommen unsinnig:

Code: Alles auswählen

if nachricht == datei.getvalue():
    pass
elif nachricht != datei.getvalue():
Dann kannst du auch gleich folgendes schreiben:

Code: Alles auswählen

if nachricht != datei.getvalue():
- Was sollte das ``time.sleep``?
- Woher kommt die 9 in ``for i in range(9):``?
- Die Kommentare der Form "--------------------- XYZ -------------------" sind totaler Unsinnn
- Wenn du ``exec`` verwendest, dann machst du immer etwas falsch. Python bietet Module zum Laden von Konfigurationsdateien
- Dein ganzer Code steht auf Modulebene und sollte besser in einer main-Funktion stehen
- Überhaupt sollte dein Code in Funktionen aufgeteilt werden. Das Programm ist ein einziges Chaos.
- Du hast überall magische Zahlen stehen, deren Bedeutung sich nicht erschliesst.
- Deine Variablennamen sind total nichtssagend: nickzahl, buchstabenzahl, zeilenzahl
- "Beginn der While-Schleife" in eine unnütze Anmerkung. Kommentare sollen mehr bieten als das offensichliche zu wiederholen.
- Warum das ``time.sleep(3)``?
- True und False existieren, da musst du kein 1 und 0 verwenden.
- Die ganze Hauptschleife ist ein einziges Durcheinander.
- ``if eingabe == "ENTFERNE_LETZTES_ELEMENT!"`` ist wirklich völliger Wahnsinn. Zum einen, dass eine Funktion so etwas als Rückgabewert liefert und zum anderen, dass das nicht in einer Konstante liegt
- Das selbe gilt für "ENTER!" und "ENTFERNE_LETZTES_ELEMENT!"
- Den ganzen Rest der Eingabeauswertung tue ich mir nicht mehr an, das ist einfach vollkommener Unfug.
- Das Modul "pygame_eingabe" ist wirklich der totale Irrsinn. Immer wenn du beginnst Code zu kopieren und den selben Code immer und immer wieder zu schreiben, dann machst du etwas falsch. Ist dir nicht die Idee gekommen, dass Pygame nicht bereits eine Methode liefert, mittels der man Tasten in Zeichen umwandeln kann? ``chr(pygame.K_a)`` liefert zum Beispiel den kleinen Buchstaben `"a"`. Und selbst wenn man das von Hand lösen wollte, dann wäre ein Dictionary um längen besser als diese ewige if-Kaskade. Hier wären natürlich auch elif angebracht.

Da sind noch viel viel mehr Fehler in dem ganzen Programm, ich hatte einfach keine Lust alles zu erklären. Ganz offensichtlich hast du vieles nicht richtig verstanden und machst selbst die grundlegensten Dinge falsch. An deiner Stelle würde ich mich mit einfacheren Projekten beschäftigen, welche vielleicht nicht noch ein GUI besitzen.

Sebastian
Das Leben ist wie ein Tennisball.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

campino97 hat geschrieben:

Code: Alles auswählen

        [...]
        if event.key == pygame.K_a:
            if shift == 1:
                eingabetext += "A"
                shift = 0
            elif shift == 0:
                eingabetext += "a"
        if event.key == pygame.K_b:
            if shift == 1:
                eingabetext += "B"
                shift = 0
            elif shift == 0:
               eingabetext += "b"
        if event.key == pygame.K_c:
            if shift == 1:
                eingabetext += "C"
                shift = 0
            elif shift == 0:
                eingabetext += "c"
        [...]
Hier schreibst du Code für Dinge, die der Computer selber viel besser erledigen kann. Wenn du Programmteile identisch oder fast identisch wiederholst ist das fast immer ein Hinweis darauf, dass du die Gemeinsamkeiten suchen und das ganze zusammenfassen solltest. Pygame verwendet hier ganz simpel eine ASCII-Zuordnung. Mit dem Wissen kannst du diese gesamte wahnsinnige Fallunterscheidung für die Buchstaben auf folgenden Code eindampfen:

Code: Alles auswählen

if ord('a') <= event.key <= ord('z'):
    eingabetext += chr(event.key).upper() if shift else chr(event.key)
*edit*: shift = 0 ist von der Logik her in dem Code überflüssig. Was stellst du dir vor, wofür das gut sein soll?


Wenn du gerne weiterhin ein eigenes Mapping haben möchtest dann erstelle dir eine Mapping-Tabelle und werte die aus, aber schreibe bitte nicht 156 Zeilen repetitiven Code. *seufz*
campino97
User
Beiträge: 42
Registriert: Freitag 3. September 2010, 20:11

ok, das ist ziemlich viel.
@eydu: wie meinst du das, dass das chat vom objekt erben sollte?
und was ist das with-statement? (bei google hab ich nichts verständliches gefunden)
Welche module gibt es zum laden von einstellungen?
@all: ich wusste nicht, dass die events in pygame in ASCII stehen.
sorry dass ich nicht in showcase geschrieben habe,mache ich das nächste mal.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

campino97 hat geschrieben:ok, das ist ziemlich viel.
@eydu: wie meinst du das, dass das chat vom objekt erben sollte?
und was ist das with-statement? (bei google hab ich nichts verständliches gefunden)
Welche module gibt es zum laden von einstellungen?

Code: Alles auswählen

with open('filename.xxx', 'r') as var_name:
    var_name.read()
(braucht kein close())

Module zum laden von einstellungen, zum speichern und laden von objekten gibt es pickle, könnte man evt. hernehmen.
campino97 hat geschrieben:@all: ich wusste nicht, dass die events in pygame in ASCII stehen.
sorry dass ich nicht in showcase geschrieben habe,mache ich das nächste mal.
Wer nichts weiß mal einen Kreis: - (Zweieck) :D
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Antworten