class client_program:
def __init__(self):
client_program.login(self)
self.root = Tk()
self.text_widget = ScrolledText(self.root, state = "disabled", font = ("",
15))
self.text_widget.pack(padx = 5, expand = 5, fill = BOTH)
self.entry_widget = Entry(self.root, font = ("Segoe UI", 20))
self.entry_widget.bind("<Return>", lambda event: self.send_message(event))
self.entry_widget.pack(padx = 5, pady = 10, fill = BOTH)
thread = threading.Thread(target = self.recieve_message)
thread.daemon = True
thread.start()
self.root.bind("<Control-u>", lambda _: self.list_users())
self.root.bind("<Control-Escape>", lambda _: self.exit())
self.root.geometry("1400x800")
self.root.mainloop()
def login(self):
self.login_window = Tk()
self.host_label = Label(self.login_window, text = "host's ip:", font =
("Courier", 30))
self.host_label.place(x = 350, y = 100)
self.host_entry = Entry(self.login_window, font = ("Courier", 30), width =
15, justify = "center")
self.host_entry.place(x = 650, y = 95)
self.port_label = Label(self.login_window, text = "connection port:", font
= ("Courier", 30))
self.port_label.place(x = 325, y = 300)
self.port_entry = Entry(self.login_window, font = ("Courier", 30), width =
10, justify = "center")
self.port_entry.place(x = 750, y = 295)
self.passwd_label = Label(self.login_window, text = "server's password:",
font = ("Courier", 30))
self.passwd_label.place(x = 300, y = 500)
self.passwd_entry = Entry(self.login_window, font = ("Courier", 30), width
= 15, justify = "center")
self.passwd_entry.place(x = 750, y = 495)
self.send_button = Button(self.login_window, text = "save", command =
lambda: client_program.send_data(self), font = ("Courier", 30))
self.send_button.place(x = 700, y = 700, anchor = CENTER)
self.login_window.geometry("1400x800")
self.login_window.mainloop()
def send_data(self):
self.host = self.host_entry.get()
self.port = int(self.port_entry.get())
self.passwd = self.passwd_entry.get()
self.login_window.destroy()
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.connect((self.host, self.port))
print(f"\n[+] successful conection to [{self.host}:{self.port}]")
self.server_socket.sendall(self.passwd.encode())
message = self.server_socket.recv(1024).decode()
print(message)
#second tkinter window
self.username_window = Tk()
username_label = Label(self.username_window, text = "username:", font =
("Courier", 30))
username_label.place(x = 325, y = 300)
self.username_entry = Entry(self.username_window, font = ("Courier", 30),
width = 10, justify = "center")
self.username_entry.place(x = 750, y = 295)
send_username_button = Button(self.username_window, text = "save", command
= lambda: client_program.send_username(self), font = ("Courier", 30))
send_username_button.place(x = 700, y = 700, anchor = CENTER)
self.username_window.geometry("1400x800")
self.username_window.mainloop()
#end of second tkiter window
self.server_socket.sendall(self.username.encode())
def send_username(self):
self.username = self.username_entry.get()
self.username_window.destroy()
def list_users(self):
self.server_socket.sendall("!users".encode())
def send_message(self, event):
message_sent = self.entry_widget.get()
self.entry_widget.delete(0, END)
self.server_socket.sendall(f'[{self.username}] {message_sent}'.encode())
self.text_widget.configure(state = "normal")
self.text_widget.insert(END, f'[{self.username}] {message_sent}\n')
self.text_widget.configure(state = "disabled")
def recieve_message(self):
while True:
try:
message = self.server_socket.recv(1024).decode()
self.text_widget.configure(state = "normal")
self.text_widget.insert(END, f'{message} \n')
self.text_widget.configure(state = "disabled")
except:
break
def exit(self):
self.server_socket.sendall(f"\n[!] user {self.username} has disconnected\
n".encode())
self.server_socket.close()
self.root.quit()
self.root.destroy()
if __name__ == "__main__":
user = client_program()