文件共享升级版

这个和上一项目的功能是一样的,不过这个用wxpython库实现了界面操作,而且还导入了上个模块中的几个方法和类,因为这个代码基本和上一个项目一样,我就说说这个wxpython功能的实现吧。

看先看代码guiclient.py:

from xmlrpclib import ServerProxy,Fault
from server import Node,UNHANDLED  
from client import randomString  
from threading import Thread
from time import sleep
from os import listdir
import sys
import wx


HEAD_START = 0.1 
SECRET_LENGTH = 100

class ListableNode(Node):

    def list(self):
        return listdir(self.dirname)
    

class Client(wx.App):
    
    def __init__(self, url, dirname, urlfile):
        super(Client, self).__init__()
        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)
        for line in open(urlfile):
                line = line.strip()
                self.server.hello(line)

    def updateList(self):

        self.files.Set(self.server.list())


    def OnInit(self):
        
        win = wx.Frame(None, title="File Sharing Client",size=(400,45))
        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=11, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM , border=10)
        
     
        bkg.SetSizer(vbox)
        win.Show()
        return True

    
    def fetchHandler(self, event):
        query =self.input.GetValue()
        try:
            self.server.fetch(query, self.secret)

        except Fault,f:
            if f.faultCode != UNHANDLED: raise
            print "Counldn't find the file",query

def main():
    
    urlfile, directory,url = sys.argv[1:]
    client = Client(url, directory, urlfile)
    client.MainLoop()

if __name__ == '__main__':
    
    main()

    

    

    

       
 
新加的类ListableNode(),主要去实现 返回文件目录中的文件。

然后是客户端类Client, 他和上一个项目的意思一样。重点是wx.APP子类化了Client

接着 updateList类 ,顾名思义,更新列表,把从服务器获得的文件名放到结合中。

之后最主要的OnInit 是这个版本的重点,创建了类Frame的对象,并且定义一些参数,接着是创建面板,然后往窗口上添加一个fetch按钮,并且把fetch按钮绑定到这个self.fetchHander方法上,接着是窗口的布局,其中proportion定义了组件在既定方向上所占空间的比列,是相对的,相对于其他组件,这是为了防止窗口在缩小或扩大的时候各个组件的位置及大小的变化。

flag参数可以使用“|”来产生多个flag组合,主要是决定窗口的边框.

最后定义了事件fetchaHandler方法,获取你输入的值,,再调用服务器中的fetch方法,和更新列表方法,如果没有你输入的文件则会引发异常。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值