Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 

94 wiersze
3.2 KiB

#!/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()