Problems Drawing Over Network

A

Andrew

Hello Everyone

I am receiving an error in an application I am working on. The
application when its done will be a Dungeons and Dragons Network game. I
am having problems with the Networked Canvas basically for drawing the
dungeon maps

If I initialize two of the Tkinter Canvas widgets with in the same
window I can draw across the network, however if I open a second
instance of the Application and initialize the canvas, on windows I recv
a "Software has caused a connection abort error", on Linux I recv a
broken pipe message

I am wondering how to go about fixing this I have spent the last 4 days
trying to figure it

Any ideas would be appreciated

Cheers

###CODE###

#CLIENT
import random
import time
from Tkinter import *
import string
import sys
import Image
import ImageTk
import JpegImagePlugin
from threading import *
import socket
import spots
import time
import thread
Image.initialized = 1



HOST = '24.207.81.142'
PORT = 8080
PORT2 = 8888


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

PORT2 = 8888

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.connect((HOST, PORT2))
ZSP = spots.ZSP(server)


def main():
global hold
hold = []
global fill
fill = '#000000'
connect()
root = Tk()
root.title('Graphics')
root.resizable(False, False)
upper = LabelFrame(root, text='Global Canvas')
lower = LabelFrame(root, text='Their Canvas')
global draw
draw = Canvas(upper, bg='#ffffff', width=400, height=300,
highlightthickness=0)
global look
#look = Canvas(lower, bg='#ffffff', width=400, height=300,
highlightthickness=0)
cursor = Button(upper, text='Cursor Color', command=change_cursor)
canvas = Button(upper, text='Canvas Color', command=change_canvas)
draw.bind('<Motion>', motion)
draw.bind('<ButtonPress-1>', press)
draw.bind('<ButtonRelease-1>', release)
draw.bind('<Button-3>', delete)
upper.grid(padx=5, pady=5)
lower.grid(padx=5, pady=5)
draw.grid(row=0, column=0, padx=5, pady=5, columnspan=2)
#look.grid(padx=5, pady=5)
cursor.grid(row=1, column=0, padx=5, pady=5, sticky=EW)
canvas.grid(row=1, column=1, padx=5, pady=5, sticky=EW)
root.mainloop()




def connect():
thread.start_new_thread(processor, ())


##def start_server():
## global ZSP
## server = socket.socket()
## server.bind(('', PORT))
## server.listen(1)
## ZSP = spots.ZSP(server.accept()[0])

def processor():
while True:
(func, args, kwargs) = ZSP.recv()
getattr(draw, func)(*args, **kwargs)
time.sleep(0.1)

def call(func, *args, **kwargs):
ZSP.send((func, args, kwargs))

################################################################################

def change_cursor():
global fill
color = tkColorChooser.askcolor(color=fill)[1]
if color is not None:
fill = color

def change_canvas():
color = tkColorChooser.askcolor(color=draw['bg'])[1]
if color is not None:
draw['bg'] = color
draw.config(bg=color)
call('config', bg=color)

################################################################################

def motion(event):
if hold:
hold.extend([event.x, event.y])
event.widget.create_line(hold[-4:], fill=fill, tag='TEMP')
call('create_line', hold[-4:], fill=fill, tag='TEMP')

def press(event):
global hold
hold = [event.x, event.y]

def release(event):
global hold
if len(hold) > 2:
event.widget.delete('TEMP')
event.widget.create_line(hold, fill=fill, smooth=True)
call('delete', 'TEMP')
call('create_line', hold, fill=fill, smooth=True)
hold = []

def delete(event):
event.widget.delete(ALL)
call('delete', ALL)
################################################################################


class App:
def __init__(self, master):
#initialize socket variables for theclient
self.thread1 = Thread(target=self.run)
self.thread1.start()
self.frameH = frameH = Frame(master, background="#ffffff")
self.labelH = Label(frameH, image=fri)
self.labelH.pack(side=TOP)
frameH.pack()

self.framettext = Frame(master)
self.scrollbar = Scrollbar(self.framettext)
self.scrollbar.pack(side=RIGHT, fill=Y, expand=TRUE)
self.textbox = Text(self.framettext)
self.textbox.pack(fill=BOTH, expand=True)
self.textbox.config(yscrollcommand=self.scrollbar.set)
self.scrollbar.config(command=self.textbox.yview)
self.framettext.pack(fill=BOTH, expand=True)

self.frame = Frame(master)
self.frame.pack(fill=X, expand=True)
self.send=Button(self.frame, text='Send Message',
command=self.send)
self.send.pack(side=LEFT)
self.draw=Button(self.frame, text='Dungeon Canvas',
command=self.openCanvas)
self.draw.pack(side=LEFT)

self.d20=Button(self.frame, text='D20', command=self.d20roll)
self.d20.pack(side=LEFT)
self.sendtext=Entry(self.frame)
self.sendtext.pack(side=LEFT, fill=X, expand=True)



################################################################################



def d20roll(self):
self.rand = random.randrange(1, 20)
rs = str(self.rand)
self.d20text = "d20 Roll " + rs
s.send(self.d20text)
self.textbox.insert(END, self.d20text)

def openCanvas(self):
main()

def send(self):
self.sendit = self.sendtext.get()
if self.sendit == "":
pass
else:
s.send(self.sendit)
self.textbox.insert(END, self.sendit + "\n")
self.sendtext.delete(0, END)


def run(self):
while 1:
data=s.recv(1024)
app.textbox.insert(END, str(data) + "\n")
time.sleep(0.1)
#################################

root = Tk()
root.wm_resizable(0, 0)
root.wm_iconbitmap("shinobi.ico")

frmimg = Image.open("banner.jpg")
fri = ImageTk.PhotoImage(frmimg)
classtitle="Tech Shinobi Chat 1.0"
root.option_readfile("optionDB")
root.title(classtitle)
root.geometry('%dx%d+%d+%d' % (500,380,0,0))
app = App(root)

root.mainloop()
s.close()

###END CODE###


That is the client now here is the server

###CODE###


#!/usr/bin/env python

#SERVER

import socket, traceback, os, sys
from threading import *
import spots
host = '' # Bind to all interfaces
port = 8888

def handlechild():
while 1:
data = ZSP.recv()
if not len(data):
break
ZSP.send((data))

# Set up the socket.
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(1)

while 1:
try:
ZSP = spots.ZSP(s.accept()[0])
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
continue

t = Thread(target=handlechild)
t.setDaemon(1)
t.start()


heres is a link to the spots module I am using
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/511435

also the original drawing application I am using
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/511436

Cheers

I appreciate any help

ty

Andrew Evans
 
P

paul

Andrew said:
Hello Everyone
[snipped stuff]
Sorry not being helpful, but I suggest you post a minimal sample of your
code demonstrating your program.

cheers
Paul
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,540
Members
45,024
Latest member
ARDU_PROgrammER

Latest Threads

Top