Python Chat?
Mir ist kein besserer Titel eingefallen, sorry :D Ich beschreibe es mal ein wenig genauer:
PS: Ich bin noch recht neu mit Pyhton & Networking :D
Ich programmiere derzeit einen Pyhton Chat, also mit sockets (
*s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)*
)
Nun habe ich ja mein input für die msg. Ich möchte jetzt gerne das mein s.recv dauerhaft "listent", das gleichzeitig aber mein Input aktiv bleibt, und wenn der reciver etwas empfängt soll das in einer zeile über dem input stehen, ohne das das was derzeit bei input steht gelöscht wird.
Derzeit bin ich so weit das mehrere clients auf den server schreiben, und wenn man dann Enter drückt wird der chat "refresht", also falls jemand anderes etwas geschrieben hat erscheint dies.
Wie bekomm ich das jetzt besser hin, also "realtime". Möglichst simpel, wie gesagt bin neu in py.
Nett wäre ein Link zu nem video tut, oder ner guten anleitung in textform, also mit gut meine ich das ich es irwie verstehn kann :Derzeit
Danke schon mal, LG Twizzy
4 Antworten
Du musst es multi Threaded machen. Wie schon in einer Antwort erwähnt.
Sagen wir du hast ein Program.
Mit Einer Methode die den ganzen Chat anzeigt usw.
und eine andere Methode die das mit dem
An den Chat schreiben regelt.
Und du Packst auf einen Thread das „zuhören“ und auf den anderen das „schreiben“ dann laufen die parallel und beides ist aktiv. Du musst nur darauf achten das wirklich beides in einem anderen Thread ist.
Jap. Weil Console nur ein task machen kann.
Du müsstest ein neues Fenster öffnen und die zwei Programme kommunizieren lassen.
K danke.
Sorry, bin wie gesagt neu bei py, wie öffne ich nen fenster üebrn code ?
und ist es möglich die "aneinaderzuheften" ?
also wie bei Teamviewer, sodass das eine Fenster dirket neben dem anderen ist und wenn man eins bewegt das andere mitzieht ? sodass es en bischen übersichtlicher ist ?
def print_text(variable):
print("Hi")
def input_m():
input_i = input("Input: ")
print(input_i)
threading.Thread(target=print_text).start()
threading.Thread(target=input_m).start()
Es gibt in Python schon eine Methode die print heißt. Du überschreibst diese und somit kannst du kein Object mitgeben.
Was soll das argument "variable" ?
So gibt das nen error weil das argument im thread nicht behandelt wird...
import time
from threading import Thread
def P():
while True:
print("Hi")
time.sleep(1)
def I():
while True:
i = input("Schreib ma wat: ")
print(i)
Thread(target=P()).start()
Thread(target=I()).start()
So weit bin ich grad mal gekommen, kein error aber der input geht net
Aber wenn du gleichzeitig nen Input haben willst, ist das wieder was anderes.
Es läuft dann zwar alles in einer console aber naja... das ist totaler blödsinn.
Wenn es dauerhaft hi Printen soll musst du einfach ne Schleife um das print „hi“ machen.
Nutzt du Pyhton 2.7 oder 3?
hats recht, da ist nen fehler drin. So ist richtig:
import threading
def print():
print("Hi")
def input_m():
input_i = input("Input: ")
print(input_i)
threading.Thread(target=print).start()
threading.Thread(target=input_m).start()
Ich bekomm jz nur noch eine fehlermeldung:
C:\Users\\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users//PycharmProjects/PyChatStreamPrototype/test.py
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Users\\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "C:\Users\\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "C:/Users//PycharmProjects/PyChatStreamPrototype/test.py", line 4, in print
print("Hi")
TypeError: print() takes 0 positional arguments but 1 was given
Input: hi
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\Users\\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "C:\Users\\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "C:/Users//PycharmProjects/PyChatStreamPrototype/test.py", line 8, in input_m
print(input_i)
TypeError: print() takes 0 positional arguments but 1 was given
Wait a Minute. Ich überlege schon ein bisschen aber der Code ergibt keinen Sinn.
def input():
input = input("Input: ") #endlos Schleife
print(input)
Machst du hier nicht eine endlos Schleife...
K, hab das einfach mal versucht:
import threading
def print():
print("Hi")
def input():
input = input("Input: ")
print(input)
threading.Thread(target=print).start()
threading.Thread(target=input).start()
Köntest du oder jmd anders das korrigieren sodas das funzt ?
Also das ziel ist das dauerhaft Hi geprintet wird und man gleichzeitig nen input hat...
Danke schon mal, LG Twizzy
Du kannst entweder mit mehreren Threads arbeiten oder besser, du baust ein eventbasiertes System auf. Ein Schritt für Schritt erklärtes Tutorial findest du hier: http://etutorials.org/Programming/Python+tutorial/Part+IV+Network+and+Web+Programming/Chapter+19.+Sockets+and+Server-Side+Network+Protocol+Modules/19.3+Event-Driven+Socket+Programs/
K danke schon mal aber bevor ich mich da durch kämpfe:
Wie ich ja gerade gelernt habe läst die konsole nur einen task auf einmal zu, ist das bei deiner anleitung was anderes ?
Sorry falls das ne dumme Frage ist, bin wie gesagt neu in Py
Ok nach allem noch mal kurz meine Gedanken für alle die auch einen Chat programmieren.
Also, Der Client besteht aus 2 Py FIles die unabhänig voneiander funzen.
Ein Fenster ist Der Chatverlauf, dieser wird vom Server gesendet.
Das andere Fenster ist der Input, dieser wird an den Server gesendet.
Hier mal ein gutes (Englisches) Tut, läst sich denk ich recht einfach zu dem beschriebenen umformen, habs (bis jetzt) noch nicht ausprobiert.
https://youtube.com/watch?v=PkfwX6RjRaI
LG Twizzy
Ach ja, das Tut ist in Py 2.7, Muss man also umschreiben, ist aber keine arbeit, einfach print "" durch print(""), input_raw() oder so zu input() und statt den mist als string zu senden zu byte convertieren
(alias + ": " + message).encode("utf-8")
str(data.decode("utf-8")
So müste es gehen
Hallo,
Multithreading / Parallelisierung ist das, wonach du suchst.
Das hab ich mir gedacht, trotzdem pausiert immer alles wenn ich nen input habe bis ich enter drücke oder ?
Alta, ich hab nur bisschen Python 2.7 gemacht xD ich kann dir nicht weiter helfen.