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