how to make python socket server work with the app.MainLoop() in wxpython?
Philippe Martin
pmartin at snakecard.com
Sun Jul 30 10:54:17 EDT 2006
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