Python3练习项目18:P2P在线文件共享(四)

这一篇教程,我们完成P2P在线文件共享项目的最后一部分。

先看一下我们的最终实现目标。

如上图所示,在下载器中我们需要添加一个文件列表,当下载完毕,文件列表刷新,显示已下载的文件。

并且,在本篇教程新增了一个双击列表中的文件名称打开文件的功能。

我们先来汇总一下要加入的所有功能、控件以及需要的模块。

一、类和方法

需要为Node新增子类,在子类中添加获取文件列表的方法,在这个方法中要调用os模块中的listdir()方法。

添加双击列表项打开文件的方法,在这个方法中需要os模块中的abspath()方法获取绝对路径,并通过system()方法打开文件。

添加更新文件列表的方法。

二、控件

添加列表控件,并绑定双击事件的处理方法。

了解了要添加的内容,我们就可以编写代码了。

示例代码中的注释部分是新增内容。

示例代码:

from os import listdir # 导入获取目录列表的方法from pclient import random_stringfrom pserver import Node, UNHANDLEDfrom xmlrpc.client import ServerProxy, Faultfrom threading import Threadfrom time import sleepfrom os.path import abspath # 导入获取绝对路径的方法import wximport sysimport os # 导入os模块HEAD_START = 0.1SECRET_LENGTH = 10class ListableNode(Node): # 定义Node子类 def file_list(self): # 定义获取文件列表的方法 return listdir(self.dirname) # 返回文件列表class Client(wx.App): def __init__(self, url_file, dir_name, url): self.dir_name = dir_name self.secret = random_string(SECRET_LENGTH) node = ListableNode(url, dir_name, self.secret) # 实例化ListableNode节点对象 thread = Thread(target=node._start) thread.setDaemon(1) thread.start() sleep(HEAD_START) self.server = ServerProxy(url) for line in open(url_file): self.server.hello(line.strip()) super(Client, self).__init__() # 这一句放在最后,否则Client对象的服务器代理尚未创建,无法正常运行。 def OnInit(self): window = wx.Frame(None, title='文件下载器', size=(400, 200)) # 修改窗口高度 background = wx.Panel(window) self.user_input = user_input = wx.TextCtrl(background) submit = wx.Button(background, label='下载', size=(80, 25)) submit.Bind(wx.EVT_BUTTON, self.fetchHandler) hbox = wx.BoxSizer() hbox.Add(user_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(background) # 添加列表控件 files.Bind(wx.EVT_LISTBOX_DCLICK, self.dclickItemHandler) # 绑定列表项点击事件处理方法 self.update_list() # 更新文件列表 vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(hbox, proportion=0, flag=wx.EXPAND) # 添加列表控件到垂直容器 vbox.Add(files, proportion=1, flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT, border=10) background.SetSizer(vbox) window.Show() return True def update_list(self): # 定义更新文件列表的方法 self.files.Set(self.server.file_list()) # 设置列表控件内容为文件列表 def dclickItemHandler(self, event): # 定义列表项点击事件的处理方法 file_path = abspath('%s/%s' % (self.dir_name, self.files.GetStringSelection())) # 获取文件绝对路径 os.system(file_path) # 打开文件 def fetchHandler(self, event): filename = self.user_input.GetValue() try: self.server.fetch(filename, self.secret) self.update_list() # 下载后更新文件列表 except Fault as f: if f.faultCode != UNHANDLED: raise print('没有找到文件:', filename)def main(): url_file, dir_name, url = sys.argv[1:] client = Client(url_file, dir_name, url) client.MainLoop()if __name__ == '__main__': main()

到这里P2P在线文件共享的练习项目就全部完成了。

大家可以在测试文件夹中添加多个测试文件,然后进行下载测试。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180421G0719J00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券