P2P Chat Application with Drawing

Questions about programming languages and debugging
Post Reply
User avatar
maboroshi
Dr. Mab
Dr. Mab
Posts: 1624
Joined: 28 Aug 2005, 16:00
18

P2P Chat Application with Drawing

Post by maboroshi »

Here is an app I wrote

its a P2P style Chat Application with the ability to draw on your friends white board

Code: Select all

from Tkinter import *
import socket
from threading import *
import cPickle
CMD_MSG, CMD_LINE = range(2)

def server():
    port = 9000
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((socket.gethostbyname(socket.gethostname()), int(port)))
    #print socket.gethostbyname(socket.gethostname()) 
    while True:
        msg, addr = s.recvfrom(2024)
        cmd, msg = ord(msg[0]),msg[1:]
        if cmd == CMD_LINE: #DRAW A LINE
            dx,dy,ex,ey=cPickle.loads(msg)
            canvas.create_line(dx,dy,ex,ey,width=2, fill="red")
        elif cmd == CMD_MSG:
            listb1.insert(END, str(msg) + "\n")

def saveit():
    try:
        output1 = listb1.get(1.0, END)
        str(output1)
        try:
            filename = tkFileDialog.asksaveasfilename()
        except:
            pass
        entry2.insert(END, filename)
        fileit = open(filename, "w")
        fileit.write(output1)
    except:
        listb1.insert(END, "Failed Saving Data\n")

    
        

def client(msg):
    port = 9000
    host = str(entryhost.get())
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.sendto(str(username.get)+" : " + msg, (host, int(port)))
    
def move(e):
    global lastLine,mx,my
    canvas.delete(lastLine)
    mx, my = e.x, e.y

    # draw a new temp line
    lastLine = canvas.create_line(dx,dy,mx,my,width=2,fill='Black')

def bdown(e):
    global lastLine,dx,dy,mx,my
    canvas.bind('<Motion>', move) #start receiving move msgs
    dx,dy=e.x,e.y
    mx,my=e.x,e.y

    # draw a temp line
    lastLine = canvas.create_line(dx,dy,mx,my,width=2,fill='Black')

def bup(e):
    #canvas.delete(lastLine)
    canvas.unbind('<Motion>')

    #send out the draw-a-line command
    client(chr(CMD_LINE)+cPickle.dumps((dx,dy,e.x,e.y),1))

def sendit(foo):
    client(chr(CMD_MSG) + str(textboxsend.get()))
    listb1.insert(1.0, str(textboxsend.get()) + "\n")
    textboxsend.delete(0, END)




 
root = Tk()
root.title("Simple P2P Chat App")
root.wm_resizable(0, 0)
root.minsize(550, 400)
#root.wm_iconbitmap("shinobi.ico")
#root.option_readfile("optionDB")

mythread = Thread(target=server)
mythread.start()

frame = Frame(root)
entryhost = Entry(frame)
entryhost.pack(side=LEFT, fill=X, expand=True)
entryhost.insert(0, "127.0.0.1")   
label = Label(frame, text="Enter IP or Domain")
label.pack(side=LEFT)
username = Entry(frame)
username.pack(side=LEFT, fill=X, expand=True)

label = Label(frame, text="Enter Your Username")
label.pack(side=LEFT)
frame.pack(fill=X)

frame2 = Frame(root)

scrollbar2 = scrollbar2 = Scrollbar(frame2)
scrollbar2.pack(side=LEFT, fill=Y)
listb1 = Text(frame2)
listb1.pack(side=LEFT, fill=BOTH, expand=True)
scrollbar2.config(command=listb1.yview)
listb1.config(yscrollcommand=scrollbar2.set)

canvas = Canvas(frame2, background="white", width=200, height=400)
canvas.pack(side=LEFT)
canvas.bind('<ButtonPress-1>',bdown)
canvas.bind('<ButtonRelease-1>', bup)

frame2.pack(fill=BOTH, expand=True)

frame.pack(fill=BOTH, expand=True)

frame = Frame(root)
textboxsend =  Entry(frame)
textboxsend.pack(side=LEFT, fill=X, expand=True)
textboxsend.bind('<Return>',sendit)
textboxsend.focus_set()
label = Label(frame, text="Enter Your Message and Press Enter")
label.pack(side=LEFT)
frame.pack(fill=X)

root.mainloop() 
May provide a download of this in the near future

User avatar
bad_brain
Site Owner
Site Owner
Posts: 11636
Joined: 06 Apr 2005, 16:00
19
Location: In your eye floaters.
Contact:

Post by bad_brain »

"may"? [-X
you WILL... 8)

Post Reply