how to make python socket server work with the app.MainLoop() in wxpython?

zxo102 zxo102 at gmail.com
Sun Jul 30 11:17:13 EDT 2006


Philippe,

Thanks a lot. I got the idea. Let me try it.

Ouyang

Philippe Martin 写道:

> Philippe Martin wrote:
>
> > zxo102 wrote:
> >
> >> Hi everyone,
> >>     I am using a python socket server to collect data from a socket
> >> client and then control a image location ( wxpython) with the data,
> >> i.e. moving the image around in the wxpython frame.
> >>    But  the "app.MainLoop()" in wxpython looks like conflicting with
> >> the "while 1:" in socket server. After I commented the
> >> "app.MainLoop()", everything is working except two things:
> >>      1. if I click anywhere on the screen with the mouse, the image is
> >> gong and only the empty frame( or panel) is left.
> >>      2. if I don't  touch anything, the image is being moved around but
> >> the previous images are left behind in the panel.
> >>     I guess that may be caused by "app.MainLoop()" commented.
> >>    Anybody knows how to make the two things work together? I really
> >> appreciate your help.
> >>    My sample code is modified based on the wxpython demo: image.py.
> >> socket client is also attached for your reference.
> >>
> >> Ouyang
> >>
> >> ################ socket server with wxpython ##############
> >>
> >> from Main import opj
> >> import wx,string
> >> class MMCS(wx.Frame):
> >>     def __init__(self):
> >>         self.bmp = wx.Image(opj('bitmaps/image.bmp'),
> >> wx.BITMAP_TYPE_BMP)
> >>         self.bmp.SetMask(True)
> >>         wx.Frame.__init__(self, parent=None, title='monitoring system',
> >> size=(500,600))
> >>         self.panel = wx.Panel(self,-1)
> >>
> >>     def monitor(self,x,y,angle):
> >>         bmp = self.bmp.Rotate(angle, (x,y), True,None)
> >>         bmp = bmp.ConvertToBitmap()
> >>
> >>         wx.StaticBitmap(self.panel, -1, bmp, (x, y), (bmp.GetWidth(),
> >> bmp.GetHeight()))
> >>         del bmp
> >>
> >> app = wx.PySimpleApp()
> >> frame = MMCS()
> >> frame.Show()
> >> frame.monitor(50,10,0.0)
> >> #app.MainLoop()
> >>
> >> # Server program
> >> from socket import *
> >> # Set the socket parameters
> >> host = "192.168.0.2"
> >> port = 21567
> >> buf = 1024
> >> addr = (host,port)
> >>
> >> # Create socket and bind to address
> >> UDPSock = socket(AF_INET,SOCK_DGRAM)
> >> UDPSock.bind(addr)
> >>
> >> # Receive messages
> >> while 1:
> >> data,addr = UDPSock.recvfrom(buf)
> >> if not data:
> >> print "Client has exited!"
> >> break
> >> else:
> >> print "\nReceived message '", data,"'"
> >>                          d = string.split(data, '-')
> >>
> >> frame.monitor(string.atoi(d[0]),string.atoi(d[1]),string.atof(d[2]))
> >> if data == 'END':
> >> print "end of moving the ship"
> >>
> >> # Close socket
> >> UDPSock.close()
> >>
> >> ############# socket client ######################>
> >> rom socket import *
> >> import time
> >>
> >> # Set the socket parameters
> >> host = "192.168.0.2"
> >> port = 21567
> >> buf = 1024
> >> addr = (host,port)
> >>
> >> # Create socket
> >> UDPSock = socket(AF_INET,SOCK_DGRAM)
> >> def_msg = "===Enter message to send to server===";
> >> print "\n",def_msg
> >>
> >> # Send messages
> >> while (1):
> >>           for i in range(100):
> >>                time.sleep(1)
> >> data = "50-100-%s"%(0.1*i)
> >> if(UDPSock.sendto(data,addr)):
> >> print "Sending message '",data,"'....."
> >> # Close socket
> >> UDPSock.close()
> >
> >
> > If you get rid of app.MaiLoop(), you basically get rid of all GUI events.
> > You need to have you server in a separate thread.
> >
> > Philippe
> PS:
> 
> http://wiki.wxpython.org/index.cgi/LongRunningTasks




More information about the Python-list mailing list