|
|
- #!/usr/bin/env python3.7
- import tkinter
- import threading
- from ChatConnection import ChatConnection
-
-
- class ChatInterface(object):
- def __init__(self, connection: ChatConnection):
- # set connection to use
- self.connection = connection
-
- # initialise tkinter window
- self.window = tkinter.Tk()
- self.window.title("Chatter") # window title
- # set method to trigger when window is close
- self.window.protocol("WM_DELETE_WINDOW", self.close)
- # end of window initialisation
-
- # initialise message frame
- self.messagesFrame = tkinter.Frame(self.window)
- # # add scrollBar to see previously recovered messages
- self.scrollBar = tkinter.Scrollbar(self.messagesFrame)
- self.scrollBar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
- # # add messagesList to print recovered messages
- self.messagesList = tkinter.Listbox(
- self.messagesFrame, height=15, width=50, yscrollcommand=self.scrollBar.set)
- self.messagesList.pack(side=tkinter.LEFT, fill=tkinter.BOTH)
- self.messagesList.pack()
- self.messagesFrame.pack()
- # end of message frame initialisation
-
- # initialise input
- self.input = tkinter.StringVar()
- self.input.set("Type your messages here.")
- # # initialise input frame
- self.inputFrame = tkinter.Entry(self.window, textvariable=self.input)
- self.inputFrame.bind("<Return>", self.send)
- self.inputFrame.pack()
- # # initialise send button
- self.sendButton = tkinter.Button(
- self.window, text="Send", command=self.send)
- self.sendButton.pack()
- # end of input initialisation
-
- def close(self, event=None) -> None:
- """
- Set input to ':quit' and trigger send method
- """
- self.input.set(":quit")
- self.send()
-
- def send(self, event=None) -> None:
- """
- Send message to connection
- """
- msg = self.input.get()
- # check if input is quit command
- if msg != ':quit':
- # clear the input bar
- self.input.set('')
- # output the client message to message list
- self.messagesList.insert(tkinter.END, '[YOU] {}'.format(msg))
- # send the message to connection
- self.connection.send(msg)
- else:
- # close the connection and window
- self.connection.close()
- self.window.quit()
-
- def listener(self) -> None:
- """
- Listener method to keep receiving new message from
- connection
- """
- while True:
- try:
- # receive messages from connection
- msg = self.connection.recv()
- # add recevied message to message list
- self.messagesList.insert(tkinter.END, msg[:-1])
- except OSError:
- break
-
- def start(self) -> None:
- """
- Start background listener and tkinter.mainloop
- """
- # initialise background listener as daemon thread
- backgroundListener = threading.Thread(target=self.listener)
- backgroundListener.daemon = True
- backgroundListener.start()
-
- # start tkinter main loop and open the GUI window
- tkinter.mainloop()
|