1
1
import socket
2
2
import threading
3
-
4
- # Choose a username
5
- username = input ("Enter your username: " )
3
+ import tkinter
4
+ from tkinter import simpledialog
6
5
7
6
# Client setup
8
7
client = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
9
8
client .connect (('localhost' , 12345 ))
10
9
11
- # Listening to server and sending messages
12
10
def receive_messages ():
13
11
while True :
14
12
try :
15
13
message = client .recv (1024 ).decode ('utf-8' )
16
14
if message == 'USERNAME' :
17
15
client .send (username .encode ('utf-8' ))
18
16
else :
19
- print ( message )
17
+ chat_box . insert ( tkinter . END , message + ' \n ' )
20
18
except :
21
19
print ('An error occurred!' )
22
20
client .close ()
23
21
break
24
22
25
- def write_messages ():
26
- while True :
27
- message = f'{ username } : { input ("" )} '
28
- client .send (message .encode ('utf-8' ))
23
+ def write_messages (event = None ):
24
+ message = message_entry .get ()
25
+ message_entry .set ('' )
26
+ if message .startswith ("@" ):
27
+ recipient , private_message = message .split (' ' , 1 )
28
+ message = f'{ recipient } { private_message } '
29
+ else :
30
+ message = f'{ username } : { message } '
31
+ client .send (message .encode ('utf-8' ))
32
+
33
+ def on_typing (event = None ):
34
+ typing_message = f"{ username } is typing..."
35
+ client .send (typing_message .encode ('utf-8' ))
36
+
37
+ def stop_typing (event = None ):
38
+ typing_message = f"{ username } stopped typing."
39
+ client .send (typing_message .encode ('utf-8' ))
40
+
41
+ # GUI setup
42
+ root = tkinter .Tk ()
43
+ root .title ("Chat Application" )
44
+
45
+ message_frame = tkinter .Frame (root )
46
+ message_frame .pack ()
47
+
48
+ scrollbar = tkinter .Scrollbar (message_frame )
49
+ scrollbar .pack (side = tkinter .RIGHT , fill = tkinter .Y )
50
+
51
+ chat_box = tkinter .Text (message_frame , height = 15 , width = 50 , yscrollcommand = scrollbar .set )
52
+ chat_box .pack (side = tkinter .LEFT , fill = tkinter .BOTH )
53
+ chat_box .pack ()
54
+
55
+ message_entry = tkinter .StringVar ()
56
+ entry_field = tkinter .Entry (root , textvariable = message_entry )
57
+ entry_field .bind ("<Return>" , write_messages )
58
+ entry_field .bind ("<KeyPress>" , on_typing )
59
+ entry_field .bind ("<KeyRelease>" , stop_typing )
60
+ entry_field .pack ()
61
+
62
+ send_button = tkinter .Button (root , text = "Send" , command = write_messages )
63
+ send_button .pack ()
64
+
65
+ username = simpledialog .askstring ("Username" , "Enter your username" , parent = root )
29
66
30
67
receive_thread = threading .Thread (target = receive_messages )
31
68
receive_thread .start ()
32
69
33
- write_thread = threading .Thread (target = write_messages )
34
- write_thread .start ()
70
+ tkinter .mainloop ()
0 commit comments