-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient2.py
More file actions
111 lines (88 loc) · 4.09 KB
/
Copy pathclient2.py
File metadata and controls
111 lines (88 loc) · 4.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import socket
import threading
from tkinter import *
# Connection Data
SERVER = '127.0.0.1'
PORT = 55555
FORMAT = "utf-8"
# Setting up client socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((SERVER, PORT))
class ChatGUI:
def __init__(self):
self.root = Tk()
self.root.title("Chatroom")
self.root.geometry("600x700")
self.root.configure(bg="#1C2833")
self.nickname = ""
# Show login screen
self.login_screen()
def login_screen(self):
# Clear previous widgets
for widget in self.root.winfo_children():
widget.destroy()
# Title Label
Label(self.root, text="Welcome to the Chatroom", font="Helvetica 20 bold", bg="#1C2833", fg="#EAECEE").pack(pady=30)
# Nickname Entry
Label(self.root, text="Enter Your Nickname", font="Helvetica 14", bg="#1C2833", fg="#ABB2B9").pack(pady=10)
self.nickname_entry = Entry(self.root, font="Helvetica 14", bg="#566573", fg="#EAECEE", bd=2, relief="solid")
self.nickname_entry.pack(pady=10)
self.nickname_entry.focus()
# Join Chat Button
Button(self.root, text="Join Chat", font="Helvetica 14 bold", bg="#28B463", fg="#EAECEE", relief="raised", command=self.connect_to_server).pack(pady=20)
def connect_to_server(self):
self.nickname = self.nickname_entry.get()
if self.nickname:
client.send(self.nickname.encode(FORMAT))
self.chat_screen()
threading.Thread(target=self.receive_messages).start()
def chat_screen(self):
# Clear previous widgets
for widget in self.root.winfo_children():
widget.destroy()
# Chat Frame
self.chat_frame = Frame(self.root, bg="#1C2833")
self.chat_frame.pack(fill=BOTH, expand=True)
# Text Area
self.text_area = Text(self.chat_frame, font="Helvetica 14", bg="#17202A", fg="#EAECEE", state=DISABLED, wrap=WORD)
self.text_area.pack(fill=BOTH, expand=True, padx=10, pady=10)
# Input Frame
self.input_frame = Frame(self.root, bg="#566573")
self.input_frame.pack(fill=X)
# Message Entry
self.message_entry = Entry(self.input_frame, font="Helvetica 14", bg="#212F3D", fg="#EAECEE", relief="solid", bd=2)
self.message_entry.pack(side=LEFT, fill=X, expand=True, padx=10, pady=10)
self.message_entry.bind("<Return>", lambda _: self.send_message())
# Send Button
self.send_button = Button(self.input_frame, text="Send", font="Helvetica 14 bold", bg="#28B463", fg="#EAECEE", relief="raised", command=self.send_message)
self.send_button.pack(side=LEFT, padx=10, pady=10)
# Leave Button
self.leave_button = Button(self.input_frame, text="Leave Chat", font="Helvetica 14 bold", bg="#E74C3C", fg="#EAECEE", relief="raised", command=self.leave_chat)
self.leave_button.pack(side=RIGHT, padx=10, pady=10)
def send_message(self):
message = self.message_entry.get()
if message:
self.message_entry.delete(0, END)
client.send(f"{self.nickname}: {message}".encode(FORMAT))
def receive_messages(self):
while True:
try:
message = client.recv(1024).decode(FORMAT)
self.text_area.config(state=NORMAL)
if message.startswith("Server:"):
self.text_area.insert(END, message + "\n", "server")
else:
self.text_area.insert(END, message + "\n")
self.text_area.tag_config("server", foreground="red", font="Helvetica 14 bold")
self.text_area.config(state=DISABLED)
self.text_area.see(END)
except:
client.close()
break
def leave_chat(self):
client.send(f"{self.nickname} left the chat!".encode(FORMAT))
client.close()
self.root.destroy()
if __name__ == "__main__":
app = ChatGUI()
app.root.mainloop()