Chatter
An irc-like chat program
import socket
import threading
from Tkinter import *
#==================================================================================================
class GUI(): #
#===============================================#
def __init__(self, root):
self._master = root
grid = Grid()
self._master.protocol("WM_DELETE_WINDOW", self._quit)
self._scrollBar = Scrollbar(self._master)
self._scrollBar.grid(row=2, column=4, sticky=N+S)
self._textbox = Text(self._master, height=20, width=50, state=DISABLED, yscrollcommand=self._scrollBar.set)
self._textbox.grid(row=2, column=1, columnspan=3, sticky=N+E+S+W)
self._scrollBar.config(command=self._textbox.yview)
self._sendButton = Button(self._master, text='Send', fg='blue', command=self._Send_Message)
self._sendButton.grid(row=3, column=1, sticky=N+E+S+W)
self._message = StringVar()
self._messageEntry = Entry(self._master, textvariable=self._message, width=35)
self._messageEntry.grid(row=3, column=2, columnspan=2, sticky=N+E+S+W)
#================================================
def display(self, string):
self._textbox.config(state=NORMAL)
self._textbox.insert(END, string + "\n")
self._textbox.config(state=DISABLED)
#================================================
def _Send_Message(self):
print "Message: " + self._message.get()
network.send(self._message.get())
self._messageEntry.delete(0, END)
#================================================
def _quit(self):
network.send("QUIT")
self._master.destroy()
#==================================================================================================
#==================================================================================================
class GetUsername(): #
#===============================================#
def __init__(self, root):
self._master = root
grid = Grid()
self._ip = StringVar()
self._ipEntry = Entry(self._master, textvariable=self._ip, width=16)
self._ipEntry.grid(row=1, column=2)
self._ipLabel = Label(self._master, text="IP: ")
self._ipLabel.grid(row=1, column=1, sticky=E)
self._port = IntVar()
self._portEntry = Entry(self._master, textvariable=self._port, width=10)
self._portEntry.grid(row=1, column=4)
self._portLabel = Label(self._master, text="Port: ")
self._portLabel.grid(row=1, column=3)
self._username = StringVar()
self._usernameEntry = Entry(self._master, textvariable=self._username, width=21)
self._usernameEntry.grid(row=2, column=2, columnspan=2)
self._usernameLabel = Label(self._master, text="Username: ")
self._usernameLabel.grid(row=2, column=1)
self._connectButton = Button(self._master, text="Connect", fg="blue", command = self._connect)
self._connectButton.grid(row=2, column=4)
self._status = Label(self._master, text="Status: Not Connected")
self._status.grid(row=3, column=2, columnspan=2)
#================================================
def _connect(self):
print self._username.get() + "@" + self._ip.get() + ":" + str(self._port.get())
network.connect(self._ip.get(), self._port.get(), self._username.get())
network.start()
#================================================
def set_status(self, status):
self._stus = "Status: " + status
self._status.config(text=self._stus)
#================================================
def quit(self):
self._master.destroy()
mgroot = Tk()
mainGUI = GUI(mgroot)
mgroot.title("Chatter")
mgroot.mainloop()
#==================================================================================================
#==================================================================================================
class Network(threading.Thread): #
#===============================================#
def __init__(self):
threading.Thread.__init__(self)
self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#================================================
def connect(self, ip, port, username):
self._ip = ip
self._port = port
self._username = username
try:
self._socket.connect((self._ip, self._port))
except:
print "Couldn't connect. Maybe this was meant to be?"
self._socket.send(self._username)
self._reply = self._socket.recv(1024)
if self._reply == "0":
getUsername.quit()
else:
getUsername.set_status("Username already taken")
#================================================
def send(self, string):
self._socket.send(string)
#================================================
def run(self):
while True:
self._msg = self._socket.recv(1024)
mgroot.display(self._msg)
#==================================================================================================
network = Network()
guroot = Tk()
getUsername = GetUsername(guroot)
guroot.title("Chatter")
guroot.mainloop()