the5fire的技术博客

关注Python、Django、Vim、Linux、Web开发、团队管理和互联网--Life is short, we need Python.


python项目练习九:文件共享2-GUI版本

作者:the5fire | 标签:       | 发布:2012-01-10 9:46 p.m. | 阅读量: 15767, 15490

有了前面的P2P基础,这一个练习就是给程序加一个可视化的界面,俗称GUI。

python里面的界面库有很多,如wxPython、wgGTK、tkinter,还有QT,按照书中的实例,我也使用wxPython来做界面。话说有了这个界面之后,我发现迅雷的网邻也不过如此(稍有夸张的成份),不过这个项目的练习之上再继续扩展的话,基本效果可以达到网邻的那种,如果有时间的话我可以继续扩展这个项目。下面就开始编写GUI。

这个里面的主要的问题应该都集中在界面上,远程共享的代码已经不需要修改了,只需要把现在的界面接上前面的代码就ok。这个wxPython库的使用,我觉得和以前使用java的awt编写界面没啥区别,没有什么难点,只是需要理解里面的几个概念,像是按钮、文本框、绑定事件,仅此而已。

还是来看代码吧:

fromxmlrpclibimportServerProxy,FaultfromserverimportNode,UNHANDLED#引入前面的程序fromclientimportrandomString#引入前面的程序fromthreadingimportThreadfromtimeimportsleepfromosimportlistdirimportsysimportwxHEAD_START=0.1#SecondsSECRET_LENGTH=100classListableNode(Node):deflist(self):returnlistdir(self.dirname)classClient(wx.App):def__init__(self,url,dirname,urlfile):self.secret=randomString(SECRET_LENGTH)n=ListableNode(url,dirname,self.secret)t=Thread(target=n._start)t.setDaemon(1)t.start()sleep(HEAD_START)self.server=ServerProxy(url)forlineinopen(urlfile):line=line.strip()self.server.hello(line)#run guisuper(Client,self).__init__()defupdateList(self):self.files.Set(self.server.list())defOnInit(self):win=wx.Frame(None,title="File Sharing Client",size=(400,399))bkg=wx.Panel(win)self.input=input=wx.TextCtrl(bkg)submit=wx.Button(bkg,label="Fetch",size=(80,25))submit.Bind(wx.EVT_BUTTON,self.fetchHandler)hbox=wx.BoxSizer()hbox.Add(input,proportion=1,flag=wx.ALL|wx.EXPAND,border=10)hbox.Add(submit,flag=wx.TOP|wx.BOTTOM|wx.RIGHT,border=10)self.files=files=wx.ListBox(bkg)self.updateList()vbox=wx.BoxSizer(wx.VERTICAL)vbox.Add(hbox,proportion=0,flag=wx.EXPAND)vbox.Add(files,proportion=1,flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM,border=10)bkg.SetSizer(vbox)win.Show()returnTruedeffetchHandler(self,event):query=self.input.GetValue()try:self.server.fetch(query,self.secret)self.updateList()exceptFault,f:iff.faultCode!=UNHANDLED:raiseprint"Counldn't find the file",querydefmain():urlfile,directory,url=sys.argv[1:]client=Client(url,directory,urlfile)client.MainLoop()if__name__=='__main__':main()

这个相比于前面关于xml-rpc的实现就简单的多了。

关于扩展的思路,目前我的想法是这样的,现在的程序监听的端口是通过命令行参数决定的。我觉得可以直接写到窗口上输入或者写死在程序里,毕竟是要使用固定的端口通信的,还有共享的文件夹以及urls里面的节点,都可以是固定的。

另外可以添局域网查询功能,就像是现在迅雷网邻的换一换,就是查找当前局域网内正在使用我们软件的所有用户,然后把他们的资源情况列到我们的列表上。

- from the5fire.com
----EOF-----

微信公众号:Python程序员杂谈

最后两周预售价


其他分类: